严蔚敏版C语言数据结构习题集答案.docx
《严蔚敏版C语言数据结构习题集答案.docx》由会员分享,可在线阅读,更多相关《严蔚敏版C语言数据结构习题集答案.docx(126页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、说明:1 .本文是对严蔚敏数据结构(C语言版)习题集书中所有算法设计题目的解 决方案,主要作者为计算机版版主一具.以下网友:siice,龙抬 头,iamkent,zames,birdthinking等为答案的修订和完善工作提出了宝贵意见,在此 表示感谢;2 .本解答中的所有算法均采用类c语言描述,设计原则为面向交流、面向阅读,作 者不保证程序能够上机正常运行(这种保证实际上也没有任何意义);3 .本解答原则上只给出源代码以及必要的注释,对于些难度较高或思路特殊的 题目将给出简要的分析说明,对于作者无法解决的题目将给出必要的讨论.目前尚 未解决的题目有:5.20, 10.40;4 .请读者在自己
2、已经解决了某个题目或进行了充分的思考之后,再参考本解答, 以保证复习效果;5 .由于作者水平所限,本解答中一定存在不少这样或者那样的错误和不足,希望 读者们在阅读中多动脑、勤思考,争取发现和纠正这些错误,写出更好的算法来. 请将你发现的错误或其它值得改进之处向作者报告:yi-ju第一章绪论1.16void print_descending(int x,int y,int z)按从大到小顺序输出三个数 (scanf(%d,%d,%d,&x,&y,&z);if(xy) xy; 为表示交换的双目运算符,以下同if(yz) yz;if(xy) xy; 冒泡排序printf(%d %d %d,x,y,z
3、);/print_descending1.17Status fib(int k,int m,int &f)求k阶斐波那契序列的第m项的值f (int tempd;if(k2llm0) return ERROR;if(mk-l) f=0;else if (m=k-l) f=l;else(for(i=0;i=k-2;i+) tempi=0;tempk-l=l;初始化for(i=k;i=m;i+) 求出序歹第k至第m个元素的值(sum=O;for(j=i-k;ji;j+) sum+=tempfj;tempi=sum;f=tempm;return OK;/fib分析:通过保存已经计算出来的结果,此方法
4、的时间复杂度仅为O(m八2).如果采用 递归编程(大多数人都会首先想到递归方法),则时间复杂度将高达O(k八m).1.18typedef struct char *sport;enum male,female gender;char schoolname; 校名为A?B,C?D或Echar result;int score; resulttype;typedef struct int malescore;int femalescore;int totalscore; scoretype;void summary(resulttype result)求各校的男女总分和团体总分,假设结果已经储 存
5、在result口数组中(scoretype score;i=0;while(resulti.sport !=NULL)(switch(result(i1.schoolname)(case A:score 0 .totalscore4-=resulti.score;if(resulti.gender=O) score 0 .malescore+=resulti.score;else score 0 .femalescore+=resulti.score;break;case B:score r .totalscore+=resulti.score;if(resulti.gender=O) sco
6、re r .malescore+=resulti.score; else score r .femalescore+=resulti.score;break;)i+;for(i=0;iv5;i+)(printf(MSchool %d:nH,i);printf(nTotal score of male:%dn,scorei.malescore);printfCTotal score of female:%dn,scorei.femalescore);printf(Total score of all:%dnnM,scorei.totalscore);)/summary1.19Status alg
7、oll9(int aARRSlZE)求 !*2Ai 序列的值且不超过 maxint(last=l;for(i= 1 ;iv=ARRSIZE;i+)(ai-l=last*2*i;if(ai-l/last)!=(2*i) reum OVERFLOW;last=ai-l;return OK;/algoll9分析:当某项的结果超过了 maxint时,它除以前面一项的商会发生异常.1.20void polyvalue()(float ad;float *p=a;printf(Input number of terms:*);scanf(*%d*,&n);printf(*Input the %d coef
8、ficients from aO to a%d:n*,n,n);for(i=0;i=n;i+) scanf(*%f*,p+);printf(*,Input value of x:*);scanf(*%f*,&x);p=a;xp=l;sum=0; /xp用于存放x的i次方for(i=0;i=n;i+)sum+=xp*(*p+);xp*=x;printf(nValue is:%f;sum);/polyvalue第二章线性表2.10Status DeleteK(SqList &a,int i,int k)删除线性表a中第i个元素起的k个元素 (if(i 1 llka.length) return I
9、NFEASIBLE;for(count=l ;i+count- 1 v二a. lengthk;count+) 注意循环结束的条件a.elemi+count-l =a.elem(i+count+k-l ;a.length-=k;return OK;/DeleteK2.11Status Insert_SqList(SqList &va,int x)把 x 插入递增有序表 va 中 (if(va.length+1 va.Iistsize) return ERROR;va.length+;for(i=va.length-l ;va.e!emix&i=0;i)va.elemi+ l=va.elemi;v
10、a.elemi+l=x;return OK;/Insert_SqList2.12int ListComp(SqList A,SqList B)比较字符表A和B,并用返冋值表示结果,值为正, 表示AB;宿为负,表示AvB;值为零,表示A=B(for(i=l;A.elemiIIB.eIemi;i+)if(A.elemi!=B.elemi) return A.elemi-B.elemi;return 0;/ListComp2.13LNode* Locate(LinkList L,int x)链表上的元素查找,返冋指针 (for(p=l-next;p&p-data!=x;p=p-next);retur
11、n p;/Locate2.14int Length(LinkList L)求链表的长度 (for(k=0,p=L;p-next;p=p-next,k+);return k;/Length2.15void ListConcat(LinkList ha,LinkList hb,LinkList &hc)把链表 hb 接在 ha 后面形成 链表he(hc=ha;p=ha;while(p-next) p=p-next;p-next=hb;/ListConcat2.16见书后答案.2.17Status Insert(LinkList &L,int i,int b)在无头结点链表L的第i个元素之前插入元素
12、 b (p=L;q=(LinkList*)malloc(sizeof(LNode);q.data=b;if(i=l) q.next=p;L=q; 插入在链表头部 else while(il) p=p-next;q-next=p-next;p-next=q;/插入在第i个元素的位置)/Insert2.18Status Delete(LinkList &L,int i)在无头结点链表L中删除第i个元素 (if(i=l) L=next; 删除第一个元素 else(P=L;while(-il) p=p-next;pnext=pnext-next; /删除第i个元素/Delete2.19Status D
13、elete_Between(Linklist &L,int mink,int maxk)/删除元素递增排列的链表 L 中值大于mink且小于maxk的所有元素 (p=L;while(p-next-datanext; /p 是最后一个不大于 mink 的兀素 if(p-next) 如果还有比mink更大的元素(q=p-next;while(q-datanext; /q 是第一个不小于 maxk 的兀素 p-next=q; /Delete_Bet ween2.20Status Delete_Equal(Linklist &L)删除元素递增排列的链表L中所有值相同的元 素p=L-next;q=p-n
14、ext; /p,q 指向相邻两元素while(p-next)(if(p-data !=q-data)p二pnext;q二pnext; 当相邻两元素不相等时,p,q都向后推步elsewhile(q-data=p-data)(free(q);q=q-next; p-next=q ;p=q ;q=p-next; 当相邻元素相等时删除多余元素/else/while /Delete_Equal2.21void reverse(SqList &A)顺序表的就地逆置(for(i= 1 j=A.length;ij ;i+,j)A.elemiA.elemj;/reverse2.22void LinkList_r
15、everse(Linklist &L)链表的就地逆置;为简化算法,假设表长大于2 (p=L-next;q=p-next;s=q-next;p-next=NULL;while(s-next)Iq-next=p;p=q;q=s;s=s-next; /把L的元素逐个插入新表表头)q-next=p;s-next=q;L-next=s;/LinkList_reverse分析:本算我的思想是,逐个地把L的当前元素q插入新的链表头部,p为新表表头.2.23void merge l(LinkList &A,LinkList &B,LinkList &C)把链表 A 和 B 合并为 C,A 和 B的元素间隔排列
16、,且使用原存储空间 (p=A-next;q=B-next;C=A;while(p&q)s=p-next;p-next=q; 将 B 的元素插入if(s)(t=q-next;q-next=s; 如A非空,将A的元素插入)p=s;q=t;/while/merge 12.24void reverse_merge(LinkList &A,LinkList &B,LinkList &C)把元素递增排列的链 表A和B合并为C,且C中元素递减排列,使用原空间(pa=A-next;pb=B-next;pre=NULL; /pa 和 pb 分别指向 A,B 的当前元素 while(pallpb)if(pa-da
17、tadatall!pb)(pc=pa;q=pa-next;pa-next=pre;pa=q; /将 A 的兀素插入新表else(pc=pb;q=pb-next;pb-next=pre;pb=q;/将 B 的元素插入新表 pre=pc;)C=A;A-next=pc: 构造新表头/reverse_merge分析:本頁法的思想是,按从小到大的顺序依次把A和B的元素插入新表的头部pc处,最后处理A或B的剩余元素.2.25void SqList_Intersect(SqList A,SqList B,SqList &C)求元素递增排列的线性表 A 和B的元翥的交集并存入C中(i=l;j=l;k=O;wh
18、ile(A.elemi&B.elemj)if(A.elemiB.elem|j) j+;if(A.elemi=B.elemj)(C.elem+k=A.elemi; 当发现了一个在A,B中都存在的元素,i+;j+; 就添加至(! C中1/while/SqList_Intersect2.26 void LinkList_Intersect(LinkList A,LinkList B,LinkList &C)在链表结构上重做上 题(p=A-next;q=B-next;pc=(LNode*)malloc(sizeof(LNode);while(p&q)if(p-datadata) p=p-next;el
19、se if(p-dataq-data) q=q-next;else(s=(LNode*)malloc(sizeof(LNode);s-data=p-data;pc-next=s;pc=s;p=p-next;q=q-next;/whileC=pc;/LinkLi st_Intersect2.27void SqList_Intersect_True(SqList &A,SqList B)求元素递增排列的线性表 A 和 B 的元素的交集并存面A中(i=l;j=l;k=O;while(A.elemi&B.elemj)if(A.elemiB.elemj) j+;else if(A.elemi!=A.el
20、emk)(A.elem+k=A.elemi; 当发现了一个在A,B中都存在的元素i+;j+; 且C中没有,就添加到C中)/whilewhile(A.elemk) A.elemk+=O;/SqList_Intersect_T rue2.28 void LinkList_Intersect_True(LinkList &A,LinkList B)在链表结构上重做上题 p=A-next;q=B-next;pc=A;while(p&q)(if(p-datadata) p=p-next;else if(p-dataq-data) q=q-next;else if(p-data! =pc-data) (p
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 严蔚敏版 语言 数据结构 习题集 答案
限制150内