1、第一章3.(1)A(2 )C(3)D5.计算下列程序中 x=x+1 的语句频度for(i=1;inext=S;B P-next= P-next-next;C P-next= S-next;D S-next= P-next;E S-next= L;F S-next= NULL;G Q= P;H while (P-next!=Q) P=P-next;I while (P-next!=NULL) P=P-next;J P= Q;K P= L;L L= S;M L= P;(3) D(4) D(5) D4. 已知顺序表 L 递增有序,编写一个算法,将 X 插入到线性表的适当位置上,以保持线性表的有序性。
2、void inserX(Seqlist *L,Elemtype x) int i; i=L-length-1; while(i=0 i-; L-length+; 7 试分别以不同的存储结构实现线性表的就地逆值的算法,即在原表的存储空间中将线性表 (a1,a2,an)逆置为(an,an-1,a1)。 (1 )以顺序表作存储结构,设线性表存于 a1:arrsize的前 elenum 个分量中。void reverseqlist(Seqlist *L)int i; int temp; for(i=0;ilength/2;i+) temp=L-elemi; L-elemi=L-elemL-length
3、-i-1; L-elemL-length-i-1=temp; (2 )以单链表作存储结构。 void reverselinklist(linklist *head) Linklist *p,*q; p=head-next; head-next=NULL; while(p-next!=NULL) q=p-next; p-next=head-next; head-next=p; p=q; 11 将线性表 A=(a1,a2,am), B=(b1,b2,bn)合并成线性表 C, C=(a1,b1,am,bm,bm+1,.bn) mn,线性表 A、B、C 以单链表作为存储结构,且 C 表利用 A 表和
4、B 表中的结点空间构成。注意:单链表的长度值 m 和 n 均未显式存储。【解答】算法如下:LinkList merge(LinkList A, LinkList B, LinkList C) Node *pa, *qa, *pb, *qb, *p;pa=A-next; /*pa 表示 A 的当前结点*/pb=B-next; p=A; / *利用 p 来指向新连接的表的表尾,初始值指向表 A 的头结点*/ while(pa!=NULL qb=qb-next;p-next=pa; /*交替选择表 A 和表 B 中的结点连接到新链表中;*/p=pa;p-next=pb;p=pb; pa=qa;pb=
5、qb; if(pa!=NULL) p-next=pa; /*A 的长度大于 B 的长度*/ if(pb!=NULL) p-next=pb; /*B 的长度大于 A 的长度*/C=A; Return(C);第三章1 B2 C3 C8 假设表达式由单字母变量和双目四则运算构成。试写一个算法,将一个通常书写形式且书写正确的表达式转为逆波兰式。【分析】算法的思想:所有的变量在逆波兰式中出现的先后顺序和在原表达式中出现的相同,因此只需要设立一个“ 栈“ ,根据操作符的“优先级“调整它们在逆波兰式中出现的顺序。#include #include #define STACK_INIT_SIZE 100#de
6、fine STACK_INCREAMENT 10typedef struct /栈char *base;char *top;int stackSize; Stack;void initStack(Stack stack.stackSize = STACK_INIT_SIZE;void push(Stack S.top = S.stackSize + S.base;S.stackSize += STACK_INCREAMENT;*S.top+ = p;void pop(Stack return ;p = *-stack.top;char getTop(Stack stack) /获得栈顶元素if
7、(stack.base = stack.top) return NULL;return *(stack.top - 1);bool isAlpha(char p) /判断是不是字母return (p = a else while(precede(getTop(stack), *p) = 0 *q+ = c;push(stack, *p);p +;void main() char str100;char newStr100;int i;for(i=0; ifront=Q-front if(Q-front=Q-front Q-elememtQ-rear=x;Q-rear=(Q-rear+1)%MA
8、XSIZE; /*设置队尾指针*/Return(TRUE);出队算法:int DeleteQueue( SeqQueue *Q , QueueElementType *x)/*删除队头元素,用 x 返回其值 */if(Q-front=Q-rear *x=Q-elementQ-front;Q-front=(Q-front+1)%MAXSIZE; /*重新设置队头指针*/if(Q-front=Q-rear) tag=0; /*队头元素出队后队列为空,重新设置标志域*/Return(TUUE); 15 ( 1)功能:将栈中元素倒置。 (2)功能:删除栈中的 e 元素。 (3)功能:将队列中的元素倒置
9、。 第四章1.设 s=I AM A STUDENT,t=GOOD, q=WORKER。给出下列操作的结果:【解答】StrLength(s)=14;SubString(sub1,s,1,7) sub1=I AM A ;SubString(sub2,s,7,1) sub2= ;StrIndex(s,4,A)=6;StrReplace(s,STUDENT,q); s=I AM A WORKER;StrCat(StrCat(sub1,t),StrCat(sub2,q) sub1=I AM A GOOD WORKER。4. 叙述以下每对术语的区别:空串和空格串;串常量与串变量;主串和子串;串变量的名字和
10、串变量的值。【解答】 不含任何字符的串称为空串,其长度为 0。仅含有空格字符的串称为空格串,其长度为串中空格字符的个数。空格符可用来分割一般的字符,便于人们识别和阅读,但计算串长时应包括这些空格符。空串在串处理中可作为任意串的子串。用引号(数据结构教学中通常用单引号,而 C 语言中用双引号)括起来的字符序列称为串常量,串值可以变化的量称为串变量。串中任意个连续的字符组成的子序列被称为该串的子串。包含子串的串又被称为该子串的主串。子串在主串中第一次出现的第一个字符的位置称子串在主串中的位置。串变量的与其它变量一样,要用名字引用其值,串变量的名字也是标识符,串变量的值可以修改。5已知:s “ (x
11、yz)*“,t “ (xz)*y“ 。试利用联结、求子串和置换等基本运算,将 s 转化为 t 。【答案】本题有多种解法,下面是其中的一种:(1 ) s1=substr(s,3,1) /*取出子串:“y“(2 ) s2=substr(s,6,1) /*取出子串:“+“(3 ) s3=substr(s,1,5) /*取出子串:“ (xyz) “ (4 ) s4=substr(s,7,1) /*取出子串:“*“(5 ) s5=replace(s3,3,1,s2)/*形成部分串:“ (x+z) “(6 ) s=s5/*s4/*s1 /*形成串 t 即“ (x+z)*y“【解析】题中所给操作的含义如下:
12、/*:连接函数,将两个串连接成一个串substr(s,i,j):取子串函数,从串 s 的第 i 个字符开始,取连续 j 个字符形成子串replace( s1,i,j,s2):置换函数,用 s2 串替换 s1 串中从第 i 个字符开始的连续 j 个字符8 编写下列算法:(1 ) 将顺序串 r 中所有值为 ch1 的字符换成 ch2 的字符。(2 ) 将顺序串 r 中所有字符按照相反的次序仍存放在 r 中。(3 ) 从顺序串 r 中删除其值等于 ch 的所有字符。(4 ) 从顺序串 r1 中第 index 个字符起求出首次与串 r2 相同的子串的起始位置。(5 ) 从顺序串 r 中删除所有与串 r
13、1 相同的子串。【解答】(1 )Void replace (Str *r, char ch1,char ch2) /将串 r 中所有值为 ch1 的字符换成 ch2 的字符 for(int i=0;ilen;i+)if (r-veci=ch1) r-veci=ch2;return;(2)Void converse(str *r) /将串 r 中所有字符按照相反的次序存放在 r 中for(int i=0;ilen/2);i+)Char ch=r-veci; r-veci=r-vecr-len-1-i;r-vecr-len-1-i=ch;Return;(3)Void delete(str *r,c
14、har ch) /从串 r 中删除其值等于 ch 的所有字符int i=0; int len=r.len;While (iveci=ch for(j=i; jvecj=r-vecj+1;len-;else i+;return;(4) int position(str r1,int index,char r2)/从串 r1 中第 index 个字符起求出首次与字符 r2 相同的子串的起始位置 if (indexr.len) return ERROR;int i=index;while (r,veci!=r2)j=i;for(t=0;tchj+!=r1.cht) break;if(t=r1.len
15、)for(j=i;j+r1.lenlen;j+)r-chj=r-chj+r1.len;r-len-=r1.len;if(t!=r1.len) i+;return(1);课 本 119页 8_1题 .c 课 本 119页 8_2题 .c 课 本 119页 8_3题 .c 课 本 119页 8_4题 .c课 本 119页 8_5题 .c第五章1.假设有 6 行 8 列的二维数组 A,每个元素占用 6 个字节,存储器按字节编址。已知 A 的基地址为 1000,计算:(1 ) 数组 A 共占用多少字节; (288)(2 ) 数组 A 的最后一个元素的地址; (1282)(3 ) 按行存储时,元素 A3
16、6 的地址; (1126)(4 ) 按列存储时,元素 A36 的地址; (1192)3. 设有一个上三角矩阵 A,将其上三角中的元素逐列压缩存储到一个 n(n+1)/2 的一维数组C(下标从 1 开始) ,请给出计算上三角矩阵中任意元素 aij ( i j )在一维数 组 C 中位置的公式。K=n+n-(i-2)*(i-1)/2+j-(i-1)=(2n-i+2)*(i-1)/2+(j-i+1) i=j4.设有三对角矩阵 Ann,将其三条对角线上的元素逐行的存于数组 B1.3n-2中,使得 Bk=aij,求:(1)用 i,j 表示 k 的下标变换公式;(2 )用 k 表示 i、j 的下标变换公式
17、。【解答】 (1)k=2(i-1)+j(2) i=k/3+1, j=k/3+k%3 ( 取整,%取余)7.编写一个在十字链表按三元组表的形式打印输出。解: 矩阵相加就是将两个矩阵中同一位置的元素值相加。由于两个稀疏矩阵的非零元素按三元组表形式存放,在建立新的三元组表 C 时,为了使三元组元素仍按行优先排列,所以每次插入的三元组不一定是 A 的,按照矩阵元素的行列去找 A 中的三元组,若有,则加入C,同时,这个元素如果在 B 中也有,则加上 B 的这个元素值,否则这个值就不变;如果 A中没有,则找 B,有则插入 C,无则查找下一个矩阵元素。 #define MaxSize 10 /用户自定义 typedef int DataType; /用户自定义 typedef struct /定义三元组 int i,j; DataType v; TriTupleNode; typedef struct /定义三元组表 TriTupleNode dataMaxSize; int m,n,t;/矩阵行,列及三元组表长度 TriTupleTable; /以下为矩阵加算法 void AddTriTuple( TriTupleTable *A, TriTupleTable *B, TriTupleTable *C) /三元组表表示的稀疏矩阵 A,B 相加 int k,l; DataType temp;