C语言程序设计习题与答案.pdf
《C语言程序设计习题与答案.pdf》由会员分享,可在线阅读,更多相关《C语言程序设计习题与答案.pdf(122页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、习题参考答案第1章1.1 什么是数据对象、数据元素、数据结构?(略)1.2 什么是数据类型?什么是抽象数据类型?(略)1.3 什么是算法?它有哪些特性?它与程序有何区别?(略)1.4 试判定下列计算过程是否为一个算法?1)开始2)n =03)n=n+14)重复3)5)结束答:不是一个算法。不能满足算法特点中有穷性的要求,其3)八=+1将使程序无限循 环下去。1.5 用图形表示下列数据结构:1)S=(D,R),D=!a,b,c,d,e,f,g,R=,2)S=(D,R),D=48,25,64,57,82,36,75 ,R=R,R2 1RI=,R2=,答:21.6 将。(1)、。(九)、0(,)、(
2、X I)、0(nlog2n)、。(log2n)、0(2)按增长率递增排列。答:。(1)、0(log2n)、。()、。(nlog2n)、。(/)、。(/)、0(21.7计算下列算法的时间复杂度:1)x=100;y=0;while(x =y*y)y=y+2;答:I/)。2)sum(int n)I int sum=0,x,j,k;f or(j=l;j=n;j+)lx=1;f or(k=1;k =j;k+)p=p*k;sum=sum+p;I return sum;I答:0(/)。第2章2.1 什么是线性结构?其特点是什么?(略)2.2试分析顺序表和链表的各自特点。(略)2.3 试编写一个算法,将一个顺
3、序表逆置,并使用最少的辅助存储空间实现。答:invert_ list(int list,int n)/*将顺序表进行逆置*/I int i,t;f or(i=1;i n/2;i+)!t=list i;list i =list n-i-1;list n-i-1 =t;1/*f or*/*invert_ list*/2.4 试编写一个算法,将两个元素值递减排列的顺序表合并为一个非递增的顺序表。答:Merge_ list(int a,int b,int c,int m,int n)int j=0,k=0,i=0;while(i m&j b j)I c k =a i;i+;k+;Ielse I c k
4、 =b j;j+;k+;!Iwhile(im)|ck=a i;i+;k+;!while(j next;while(p!=head)Ip=p-next;length+;!/*while*/printf(the length of the list is:%d n,length);/*length*/2.6 试编写一个算法,在一个递增有序排列的单链表中插入一个新结点%,并保持有序。答:struct Linknod e Iint d ata;struct Linknod e*next;!;typed ef struct Linknod e*Link;Link insert(Link head)Iin
5、t i,e,j;Link pointer,s;printf(nplease input the elem of you want insert:);scanf(%d ,&e);pointer=head;while(pointer-next&e =pointer-next-d ata)/*在链表中确定插入的位置*/pointer=pointer-next;if(!pointer-next)s=(Link)malloc(sizeof C struct Linknod e);s-d ata=e;pointer-next=s;s-next=NULL;Ielse Is 二(Link)malloc(siz
6、eof(struct Linknod e);s-d ata=e;/*为插入的结点建立链接关系*/s-next=pointer-next;pointer-next=s;/*if*/return head;!/*LinkList_ insert*/2.7 试编写一个算法,将一个单链表逆置。答:struct Linknod e Iint d ata;struct Linknod e*next;typed ef struct Linknod e*Link;invert(Link head)/将带头结点的单链表进行逆置*/Link p,q,r;4p=head-next;q=p-next;p-next=N
7、ULL;while(q)!r=q-next;q-next=p;head-next=q;P=q;q 二 r;l/while*/Print(head);/*invert*/2.8 试编写一个算法,在一个双向循环链表中将结点%插入到指定结点p之前 答:struct DuLinknod eIint d ata;struct DuLinknod e*prior;/*直接前马区*/struct DuLinknod e*next;/*直接后继*/i;typed ef struct DuLinknod e*DuLink;DuLink insert(DuLink head)/*在第 i 个位置之前插入 x*/i
8、nt i,e,j;DuLink pointer,new;printf(nplease input the elem of you want insert:);scanf(%d,&e);printf(nplease input the location of you want insert:);scanf(%d ,&i);pointer=head-next;j=1;while(pointer-d ata&j v i)/*在链表中确定插入的位置*/pointer=pointer-next;+j;/*while*/if(!pointer-d ata I Ij i)printf(error);else
9、 Inew=(DuLink)malloc(sizeof(struct DuLinknod e);new-d ata=e;new-prior=pointer-prior;/*为插入的结点建立链接关系*/pointer-prior-next=new;new-next=pointer;pointer-prior=new;/*if*/return head;/*DuLinkList_ insert*/2.9 若有4个元素,入栈顺序为ABCD,请列出所有可能的出栈序列。答:所有可能的出栈序列一共有16种,如下:ABCD ABDC ACBD ACDB ADCB BACD BADCBCDA BCAD BDC
10、A CBDA CBAD CDBA DCBA习题参考答案 5*2.10试编写一个算法,让两个顺序栈共用一个数组SscHN,分别实现人栈、出栈操 作。答:定义共享栈的数据结构:#d ef ine MAX 100int stack MAX ,topi=0,top=MAX-1;(1)共享进栈算法void pushl(int x)Iif(topi top2)printf(overf low);else Istack topi =x;topi+;iIvoid push2(int x)if(topi top2)printf(overf low);else Istack top2 =x;top2;(2)共享出
11、栈算法int popl()!if(topi 二 二 0)Sprintf(und erf low );return(NULL);i topi-;return(stack topi);Iint pop2()if(top2=MAX-1)iprintf(und erf low );return(NULL);(top2+;return(stack top2);I2.11试编写一个算法,计算一个循环队列中包含的元素个数。答:struct queuenod e!struct queuenod e*base;int f ront;int rear;1;typed ef struct queuenod e*sq
12、Queue;QueueLength(sqQueue q)Iint x;x=(q-rear-q-f ront+maxsize)%maxsize;printf(the length is%d n,x);I/*QueueLength*/2.12试编写一个算法,实现链栈的人栈、出栈操作。答:struct stacknod e iint d ata;6struct stacknod e*next;1;typed ef struct stacknod e*Nod e;pushstack(Nod e top)/*入栈*/int e;Nod e new;printf(Xnplcaoc input the d
13、ata(No f or 0):);scanf(%d ,&e);if(e!=0)Inew=(Nod e)malloc(sizeof(struct stacknod e);/*分配结点*/new-d ata=e;/*初始化结点*/new-next=top-next;top-next=new;/*插入结点*/top-d ata+;I/*if*/*pushstack*/popstack(Nod e top)int answer;printf(nAre you want d elete the d ata?);/*用户确认是否删除*/printf(nplease answer 1 f or Y or 0
14、 f or N:);scanf(%d ,&answer);switch(answer)Icase(1):d elete(top);break;case(0):break;d ef ault:printf(nyour answer is error!n);I/*switch*/1/*pop*/d elete(Nod e top)/*弹栈*/iNod e old;if(top-next=NULL)printf(the stack is empty!);else Iold=top-next;/*old指向待删除的结点*/top-next=old-next;/*删除结点*/printf(nthe d
15、elete d ata is%d n,old-d ata);f ree(old);/*释放空间*/top-d ata-;/*else*/I/*d elete*/2.13试编写一个算法,实现对个以只带尾指针的循环单链表表示的队列的入队、出队操 作。答:struct queuenod e Iint d ata;struct queuenod e*next;习题参考答案7typed ef struct queuenod e*Nod e;Nod e enqueue(Nod e f ront,Nod e rear)I int e;Nod e new;printf(nplease input the d
16、ata(No f or 0):);scanf(%d,&e);i f(e!-0)(new=(Nod e)malloc(sizeof(struct queuenod e);/*分配结点*/if(!new)exit(0);/*分配失败*/new-d ata=e;/*初始化结点*/new-next=NULL;rear-next=new;/*插入新结点*/rear二new;/*队尾指针后移*/f ront-d ata+;I/*if*/return rear;I/*enqueue*/Nod e d equeue(Nod e f ront,Nod e rear)I Nod e old;if(f ront 二
17、 二 rear)printf(nthe queue is empty!);else I old二f ront-next;/*old指向待删除的结点*/printf(nthe d elete d ata is%d n,old-d ata);f ront-next=old-next;/*删除结点*/if(rear=old)rear=f ront;f ree(old);/*释放空间*/f ront-d ata-;I/*else*/return rear;/*d equeue*/第3章3.1 设字符串 S=good ,T=I am a stud ent,/?=!,求:答:(1)CONCA7X T,R,
18、S)=I am a stud ent!good(2)SUBSTR(7,8,7)=stud ent(3)Len(D=14(4)index(.T,a)=3(5)insert(T,S,8)=I am a good stud ent(6)replaced T,SUBSTR 7,8,7),teacher)=I am a teacher3.2 设a=*+XyZ,6=(X+Y)*Z,试用连接、求子串和置换等操作,将串。转换 成字符串6,写出其转换过程。答:用求子串与连接操作将串。变换成人因为有:*=SUBST a,1,1);+=SUBST a,2,1);X=SUBSTI a,3,l);7=SUB-STR(a
19、,4,1);Z=SUBSTR(a,5,1)8所以有:d=CONCATi(,X Y);e=CONCATi ),Z)最后有:b=CONCATX d,e)=(X+丫)*Z3.3 若x和y是两个单链表存储的串,试设计一个算法,找出x中第一个不在y中出现的 字符。答:单链表的存储结构如下定义:设其结点数据域d ata只存储1个字符,若X和y是 两个单链表存储的串,且头指针分别为x和y,则查找x中第一个不在y中出现 的字符的算法描述为:typed ef struct Nod e Ichar d ata;struct Nod e*Next;iLink;Search(Link*X,Link*Y)Ip=X-Ne
20、xt;/*p为X串的查询指针*/while p!=NULL!q=Y-Next;while q!=NULLif p-d ata=q-d ata/*q 为 Y 串的查询指针*/q=q-Nextelse return”该字符不在Y串中p=p-Next;Iif p=NULLreturn 串X中的字符全部在Y中return p-d ata3.4 设结点数据域可存放4个字符,以这样的结点构成单链表来存储。写出将串T插入到 串S某个字符之后的算法,若S中不存在该字符,则将串T连接在S的后面。答:因单链表结点数据域可存放4个字符,链表中最后一个结点不一定全部被串值占满,此时通常应补上或其他非串值来填满最后结点
21、的数据域,在这种块链 结构上实现将串T插入到串S中某个字符之后的算法逻辑描述如下:若设为某个指定的字符,且先在串S中存在,则该字符将串S分解成两个串就 和S2。串片的首字符是串5的首字符,串的尾字符是申5中首次出现的字符%;串S2的首字符是串S中字符的后继字符,串2的尾字符是串S的尾字符。因此,该算法为连接三个串,即。5Vs 7TS1,T,2)。若串S中不存在,则算法 为 CONCATO S,T)03.5计算下列串的7的值:答:(1)序号(j):模式串T:next(j):(2)序号(j):4b348 b381235679a01a12a23c15a16a27a19习题参考答案9模式串T:next
22、(j):(3)序号(j):模式串T:next(j):a01 b0a13 b1a14 b2c36 b3c b2 18 b33.6 对 S=aabcbabcaabcaaba,配过程。若S串长度为,T=abcaaba,画出以T为模式串、S为目标串的快速匹T串长度为小,问该算法的时间复杂度为多少?答:计算模式串T的碇权数组为:序号(j):模式串r:next(j):借助于加数组,进行快速匹配找到T=SUBSTR(S,10,7),具体过程如下:序号3):模式串s:匹配过程:1()11b12131415b16b12a11a02 b1341aaa2a bbc1a13b4ccaab25a47a2a45a25ba
23、aa6 b26abbb7a(m=7)37baac8ca9aaaacaaabb)acaaab注:字符下有符号的表示用该字符比较产生不等,括号中的字符表示跳过的字 符。该算法的时间复杂度为。(+机)。这是因为在快速匹配过程中,利用了模式 串丁的碇口数组,使得指示目标串的指针不许回溯,对目标串仅需从头至尾扫视 一遍即可。3.7 采用顺序结构存储串,编写一个实现具有通配符?的模式串S与目标串丁进行匹配 的函数一征/改()。通配符?可以和任意字符匹配;若匹配成功则返回串S在 目标串丁中首次出现的下标位置,否则返回-1。例如,pattern _ index(?re,there are)返回结果 2。答:具
24、有通配符的模式串S与目标串7的匹配函数如下:int pattern_ ind ex(char s,char t)/*若匹配成功,则返回首次匹配的下标位置,否则返回*/Iint i,j;int f ound=-1;i=j=0;while(t j!=1 01)I if(s i =1 01)return f ound;if(s i =?I I s i =t j)I i f(f ound=-1)f ound=j;10elseif(s i!=t j&f ound!=-1)/*从模式串S起始位置重新匹配*/I i=0;f ound=-1;(else j+;I return f ound;i第4章4.1已知
25、二维数组瓦加,对采用行序为主方式存储,每个元素占L个存储单元,并且第一 个元素的存储地址是L()a A(),0),则A:i J 的地址是什么?答:i,j 的存储地址是:Loa 5)=(。(40,0)+(i*n+j)k4.2设行列的下三角矩阵4已压缩到一维数组51.*(+1)/2中,若按行序为主 存储,则A ij对应的S中的存储位置是什么?答:A,j在S中的存储位置K是:,(1+1)/2+j,当,刁时 K=n(n+1)/2,当/源时4.3 一个稀疏矩阵如图4-16所示,求对应的三元组表示、十字链表表示。0 0 2 03 0 0 00 0-150 0 0 0图4-16 一个稀疏矩阵答:对应的三元组
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 习题 答案
限制150内