严蔚敏习题答案.pdf
《严蔚敏习题答案.pdf》由会员分享,可在线阅读,更多相关《严蔚敏习题答案.pdf(129页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、说明:1.本文是对严蔚敏 数据结构(C语言版)习题集一书中所有算法设计题目的解决方案,主要作者为一具似下网友:biwier,szm99,siice,龙抬头,iamkent,zames,birdthinking,lovebuaa等为答案的修订和完善工作提出了宝贵意见,在此表示感谢;2.本解答中而所,算法均采用类c语言描述,设计原则为面向交流、面向阅读,作者不保证程序能够上机正常运行(这种保证实际上也没有任何意义);3.本解答原则上只给出源代码以及必要的注释,对于一些难度较高或思路特殊的题目将给出简要的分析说明,对于作者无法解决的题目将给出必要的讨论.目前尚未解决的题目有:5.20,10.40;4
2、.请读者在自己已经解决了某个题目或进行了充分的思考之后,再参考本解答,以保证复习效果;5.由于作者水城所限,本解答中一定存在不少这样或者那样的错误和不足,希望读者们在阅读中多动脑、勤思考,争取发现和纠正这些错误,写出更好的算法来.请将你发现的错误或其它值得改进之处向作者报告:yi-第一章绪论1.16void print_descending(int x,int y,int z)按从大到小顺序输出三个数(scanf(%d,%d,%d;&x,&y,&z);if(xy;。为表示交换的双目运算符,以下同if(yz)yz;if(xy;冒泡排序printf(M%d%d%dx,y,z);/print_des
3、cending1.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-1 II m=k)f=l;else(for(i=0;i=k-2;i+)tempi=0;tempk-l=l;tempk=l;初始化sum=l;j=o;for(i=k+l;i=m;i+,j+)/求出序列第k 至第m 个元素的值tempi=2*sum-tempj;f=tempm;return OK;/fib分析:k 阶斐波那契序列的第m 项的值fm=fm-l+fm-2+fm-
4、k=ffm-l+fm-2+fm-k+fm-k-l-fm-k-l=2*fm-1 -fm-k-l所以上述算法的时间复杂度仅为O(m).如果采用递归设计,将达到O(k八 m).即使采用暂存中间结果的方法,也将达到O(m八 2).1.18typedef struct char*sport;enum male,female gender;char schoolname;/校名为 A,E,C,D 或 Echar*result;int score;resulttype;typedef struct int malescore;int femalescore;int totalscore;scoretype;
5、void summary(resulttype result)求各校的男女总分和团体总分,假设结果已经储存在result数组中(scoretype scoreMAXSIZE;i=0;while(resulti.sport!=NULL)(switch(resulti.schoolname)(case A:scoref 0.totalscore+=resulti.score;if(resulti.gender=0)score 0.malescore+=resulti.score;else scoref 0.femalescore+=resulti.score;break;case B:score
6、0 .totalscore+=resulti.score;if(resultfi.gender=0)score 0.malescore+=resultfi.score;else score 0.femalescore+=resulti.score;break;i+;)for(i=0;i5;i+)printf(HSchool%d:nn,i);printf(Total score of male:%dnn,scorefi.malescore);printf(Total score of female:%dn,scorei.femalescore);printf(nTotal score of al
7、l:%dnn,score i .to tai score);)/summary1.19Status algoll9(int aARRSIZE)求 i!*2Ai 序列的值且不超过 maxint(last=l;for(i=1 ;i=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 temp;float*p=a;printf(nInput numb
8、er of terms:);scanf(n%d,&n);printf(Input value of x:n);scanf(n%fr,&x);printf(nInput the%d coefficients from aO to a%d:nn+l,n);p=a;xp=l;sum=0;/xp用于存放x的i次方for(i=0;i=n;i+)scanf(n%f&temp);sum+=xp*(temp);xp*=x;)printf(nValue is:%fn,sum);/poly value第二章线性表2.10Status DeleteK(SqList&a,int i,int k)删除线性表a 中第i
9、个元素起的k 个元素(if(illlka.length)return INFEASIBLE;for(count=1 ;i+count-1 v=a.length-k;count+)注意循环结束的条件a.elemi+count-l=a.elemi+count+k-1 ;a.length-=k;return OK;/DeleteK2.11Status Insert_SqList(SqList&va,int x)把 x 插入递增有序表 va 中(if(va.length+lva.listsize)return ERROR;va.length+;for(i=va.length-1 ;va.elemix&
10、i=0;i)va.elemi+l=va.elemi;va.elemi+l=x;return OK;/Insert_SqList2.12int ListComp(SqList A,SqList B)比较字符表A 和 B,并用返回值表示结果,值为1,表示AB;值为-1,表示AvB;值为0,表示A=B(fbr(i=1 ;i=A.length&iB.elemi?l:-l;if(A.length=B.length)return 0;return A.lengthB.length?11;当两个字符表可以互相比较的部分完全相同时,哪个较长,哪个就较大/ListComp2.13LNode*Locate(Lin
11、kList L,int x)链表上的元素查找,返回指针(for(p=l-next;p&p-data!=x;p=p-next);return 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见书后答
12、案.2.17Status Insert(LinkList&L,int i,int b)在无头结点链表L的第i个元素之前插入元素b(p=L;q=(LinkList*)malloc(sizeof(LNode);q.data=b;if(i=l)(q.next=p;L=q;插入在链表头部elsewhile(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=L-next;删除第一个元素else(P=L;while(il
13、)p=p-next;p-next=p-next-next;/删除第 i 个元素)/Delete2.19Status Delete_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_B etween2.20Status Delete_Eq
14、ual(Linklist&L)删除元素递增排列的链表L 中所有值相同的元素(p=L-next;q=p-next;/p,q 指向相邻两元素while(p-next)(if(p-data!=q-data)(p=p-next;q=p-next;当相邻两元素不相等时,p,q都向后推一步else(while(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=l,j=A.length;ij;
15、i+,j)A.elemiA.elem j;/reverse2.22void LinkList_reverse(Linklist&L)链表的就地逆置;为简化算法,假设表长大于2(p=L-next;q=p-next;s=q-next;p-next=NULL;while(s-next)(q-next=p;p=q;q=s;s=s-next;把L的元素逐个插入新表表头)q-next=p;s-next=q;L-next=s;/Li nkList_re verse分析:本算我的思想是,逐个地把L的当前元素q插入新的链表头部,p为新表表头.2.23void mergel(LinkList&A,LinkList
16、&B,LinkList&C)把链表 A 和 B 合并为 C,A 和B的元素间隔排列,且使用原存储空间(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!2.24void reverse_merge(LinkList&A,LinkList&B,LinkList&C)把元素递增排列的链表 A 和B 合并为C,且C 中元素递减排列,使用原空间(pa=A-next;pb=B-next;pre=NULL;pa 和 pb
17、 分别指向 A,B 的当前元素while(pallpb)if(pa-datadatall!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)求元素递
18、增排列的线性表 A和 B 的元翥的交集并存入C 中(i=l;j=l;k=O;while(A.elemi&B.elemj)(if(A.elemiB.elemj)j+;if(A.elemi=B.elemj)(C.elem|+k=A.elemi;当发现了一个在A,B中都存在的元素,i+;j+;就添加到C 中/while/SqList_Intersect2.26void LinkList_Intersect(LinkList A,LinkList B,LinkList&C)在链表结构上重做上题(p=A-next;q=B-next;pc=(LNode*)malloc(sizeof(LNode);C=pc
19、;while(p&q)(if(p-datadata)p=p-next;else if(pdataq-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;/while/LinkList_Intersect2.27void SqList_Intersect_True(SqList&A,SqList B)求元素递增排列的线性表 A 和 B的元素的交集并存i f A中(i=l;j=l;k=O;while(A.elemi&B.elemj)(if(A.elemiB.
20、elemfj)j+;else if(A.elemi!=A.elemk)(A.eIem+k=A.elemi;当发现了 个在A,B中都存在的元素i+;j+;且C中没有,就添加到C中)else i+;j+;/whilewhile(A.elemk)A.elemk+=0;/SqList_Intersect_True2.28void 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
21、-next;else if(p-data!=pc-data)(pc=pc-next;pc-data=p-data;p=p-next;q=q-next;/while/LinkList_Intersect_True2.29void SqList_Intersect_Delete(SqList&A,SqList B,SqList C)(i=0;j=0;k=0;m=0;i 指示A 中元素原来的位置,m 为移动后的位置while(iA.length&jB.length&kC.length)(if(B.elemjC.elemk)k+;else(same=B.elemfj;找到了相同元素 samewhi!e
22、(B.elemj=same)j+;while(C.elemfk=same)k+;/j,k 后移到新的元素while(iA.length&A.elemisame)A.elemm+=A.elemi+;需保留的元素移动到新位置while(iA.length&A.elemi=same)i+;跳过相同的元素)/whilewhile(inext;q=C-next;r=A-next;while(p&q&r)(if(p-datadata)p=p-next;else if(p-dataq-data)q=q-next;else(u=p-data;确定待删除元素uwhile(r-next-datanext;确定最后
23、一个小于u的元素指针rif(r-next-data=u)(s=r-next;while(s-data=u)(t=s;s=s next;free(t);确定第一个大于u的元素指针s/whiler-next=s;删除r和s之间的元素/ifwhile(p-data=u)p=p-next;while(q-data=u)q=q-next;/else/while/LinkList_Intersect_Delete2.31Status Delete_Pre(CiLNode*s)删除单循环链表中结点s的直接前驱(p=s;while(p-next-next!=s)p=p-next;找到 s 的前驱的前驱 pp-
24、next=s;return OK;/Delete_Pre2.32Status DuLNode_Pre(DuLinkList&L)完成双向循环链表结点的pre域for(p=L;!p-next-pre;p=p-next)p-next-pre=p;return OK;/DuLNode_Pre2.33Status LinkList_Divide(LinkList&L,CiList&A,CiList&B,CiList&C)把单链表 L的元素按类型分为三个循环链表CiList为带头结点的单循环链表类型.(s=L-next;A=(CiList*)malloc(sizeof(CiLNode);p=A;B=(C
25、iList*)malloc(sizeof(CiLNode);q=B;C=(CiList*)malloc(sizeof(CiLNode);r=C;建立头结点while(s)(if(isalphabet(s-data)(p-next=s;p=s;)else if(isdigit(s-data)(q-next=s;q=s;elser-next=s;r=s;/whilep next=A;qnext=B;rnext=C;/完成循环链表/LinkList_Divide2.34void Print_XorLinkedList(XorLinkedList L)从左向右输出异或链表的元素值(p=L.left;p
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 严蔚敏 习题 答案
限制150内