数据结构(c语言版)习题集全答案.pdf
《数据结构(c语言版)习题集全答案.pdf》由会员分享,可在线阅读,更多相关《数据结构(c语言版)习题集全答案.pdf(41页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、说明:1.本文是对严蔚敏数据结构(c 语言版)习题集一书中所有算法设计题目的解决方案,主要作者为 计算机版版主一具.以下网友:siice,龙抬头,iamkent,zames,birdthinking 等为答案的修订和完善工作提出了宝贵意见,在此表示感谢;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)xy;/为表示交换的双目运算符,以下同if(yz)yz;if(xy)xy;/冒泡排序printf(%d%d%d,x,y,z);/print_descen
3、ding1.17Status fib(int k,int m,int&f)/求 k 阶斐波那契序列的第 m 项的值 fint tempd;if(k2|m0)return ERROR;if(mk-1)f=0;else if(m=k-1)f=1;elsefor(i=0;i=k-2;i+)tempi=0;tempk-1=1;/初始化for(i=k;i=m;i+)/求出序列第 k 至第 m 个元素的值sum=0;for(j=i-k;ji;j+)sum+=tempj;tempi=sum;f=tempm;return OK;/fib分析:通过保存已经计算出来的结果,此方法的时间复杂度仅为 O(m2).如果
4、采用递归编程(大多数人都会首先想到递归方法),则时间复杂度将高达O(km).1.18typedef structchar*sport;enummale,female gender;char schoolname;/校名为A,B,C,D或Echar*result;int score;resulttype;typedef structint malescore;int femalescore;int totalscore;scoretype;void summary(resulttype result)/求各校的男女总分和团体总分,假设结果已经储存在 result 数组中scoretype sco
5、re;i=0;while(resulti.sport!=NULL)switch(resulti.schoolname)case A:score 0.totalscore+=resulti.score;if(resulti.gender=0)score 0.malescore+=resulti.score;else score 0.femalescore+=resulti.score;break;case B:score.totalscore+=resulti.score;if(resulti.gender=0)score.malescore+=resulti.score;else score.
6、femalescore+=resulti.score;break;i+;for(i=0;i5;i+)printf(School%d:n,i);printf(Total score of male:%dn,scorei.malescore);printf(Total score of female:%dn,scorei.femalescore);printf(Total score of all:%dnn,scorei.totalscore);/summary1.19Status algo119(int aARRSIZE)/求 i!*2i 序列的值且不超过 maxintlast=1;for(i=
7、1;i=ARRSIZE;i+)ai-1=last*2*i;if(ai-1/last)!=(2*i)reurn OVERFLOW;last=ai-1;return OK;/algo119分析:当某一项的结果超过了 maxint 时,它除以前面一项的商会发生异常.1.20void polyvalue()float ad;float*p=a;printf(Input number of terms:);scanf(%d,&n);printf(Input the%d coefficients from a0 to a%d:n,n,n);for(i=0;i=n;i+)scanf(%f,p+);print
8、f(Input value of x:);scanf(%f,&x);p=a;xp=1;sum=0;/xp 用于存放 x 的 i 次方for(i=0;i=n;i+)sum+=xp*(*p+);xp*=x;printf(Value is:%f,sum);/polyvalue第二章 线性表2.10Status DeleteK(SqList&a,int i,int k)/删除线性表 a 中第 i 个元素起的 k 个元素if(i1|ka.length)return INFEASIBLE;for(count=1;i+count-1va.listsize)return ERROR;va.length+;fo
9、r(i=va.length-1;va.elemix&i=0;i-)va.elemi+1=va.elemi;va.elemi+1=x;return OK;/Insert_SqList2.12int ListComp(SqList A,SqList B)/比较字符表 A 和 B,并用返回值表示结果,值为正,表示 AB;值为负,表示 Anext;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 L
10、istConcat(LinkList ha,LinkList hb,LinkList&hc)/把链表 hb接在 ha 后面形成链表 hchc=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 个元素之前插入元素 bp=L;q=(LinkList*)malloc(sizeof(LNode);q.data=b;if(i=1)q.next=p;L=q;/插入在链表头部elsewhile(-i1)p=p-next;q-
11、next=p-next;p-next=q;/插入在第 i 个元素的位置/Insert2.18Status Delete(LinkList&L,int i)/在无头结点链表 L 中删除第 i 个元素if(i=1)L=L-next;/删除第一个元素elsep=L;while(-i1)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-data
12、next;/p 是最后一个不大于 mink的元素if(p-next)/如果还有比 mink 更大的元素q=p-next;while(q-datanext;/q 是第一个不小于 maxk 的元素p-next=q;/Delete_Between2.20Status Delete_Equal(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 都向后推一步elsewhile(q-data=p-d
13、ata)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_reverse(Linklist&L)/链表的就地逆置;为简化算法,假设表长大于 2p=L-next;q=p-next;s=q-next;p-next=NULL;while(s-next)q-next=p;p=q;q=s;s=s
14、-next;/把 L 的元素逐个插入新表表头q-next=p;s-next=q;L-next=s;/LinkList_reverse分析:本算法的思想是,逐个地把 L 的当前元素 q插入新的链表头部,p 为新表表头.2.23void merge1(LinkList&A,LinkList&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;
15、q=t;/while/merge12.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(pa|pb)if(pa-datadata|!pb)pc=pa;q=pa-next;pa-next=pre;pa=q;/将 A 的元素插入新表elsepc=pb;q=pb-next;pb-next=pre;pb=q;/将 B 的元素插入新表pre=pc;C=A
16、;A-next=pc;/构造新表头/reverse_merge分析:本算法的思想是,按从小到大的顺序依次把 A 和 B 的元素插入新表的头部 pc 处,最后处理 A 或 B 的剩余元素.2.25void SqList_Intersect(SqList A,SqList B,SqList&C)/求元素递增排列的线性表 A 和 B 的元素的交集并存入 C 中i=1;j=1;k=0;while(A.elemi&B.elemj)if(A.elemiB.elemj)j+;if(A.elemi=B.elemj)C.elem+k=A.elemi;/当发现了一个在 A,B 中都存在的元素,i+;j+;/就添加
17、到 C 中/while/SqList_Intersect2.26void 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;else if(p-dataq-data)q=q-next;elses=(LNode*)malloc(sizeof(LNode);s-data=p-data;pc-next=s;pc=s;p=p-next;q=q-next;/whil
18、eC=pc;/LinkList_Intersect2.27void SqList_Intersect_True(SqList&A,SqList B)/求元素递增排列的线性表 A 和 B 的元素的交集并存回 A 中i=1;j=1;k=0;while(A.elemi&B.elemj)if(A.elemiB.elemj)j+;else if(A.elemi!=A.elemk)A.elem+k=A.elemi;/当发现了一个在 A,B 中都存在的元素i+;j+;/且 C 中没有,就添加到 C 中/whilewhile(A.elemk)A.elemk+=0;/SqList_Intersect_True2
19、.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-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,
20、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+;elsesame=B.elemj;/找到了相同元素 samewhile(B.elemj=same)j+;while(C.elemk=same)k+;/j,k 后移到新的元素while(iA.length&A.elemisame)A.elemm+=A.elemi+;/需保留的元素移动到新位置while(iA.length&A.elemi=same)i+;/跳过相同的元素/whilew
21、hile(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;elseu=p-data;/确定待删除元素 uwhile(r-next-datanext;/确定最后一个小于 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
22、(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-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_
23、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=(CiList*)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-d
24、ata)q-next=s;q=s;elser-next=s;r=s;/whilep-next=A;q-next=B;r-next=C;/完成循环链表/LinkList_Divide2.34void Print_XorLinkedList(XorLinkedList L)/从左向右输出异或链表的元素值p=L.left;pre=NULL;while(p)printf(%d,p-data);q=XorP(p-LRPtr,pre);pre=p;p=q;/任何一个结点的 LRPtr 域值与其左结点指针进行异或运算即得到其右结点指针/Print_XorLinkedList2.35Status Insert
25、_XorLinkedList(XorLinkedList&L,int x,int i)/在异或链表 L 的第 i 个元素前插入元素 xp=L.left;pre=NULL;r=(XorNode*)malloc(sizeof(XorNode);r-data=x;if(i=1)/当插入点在最左边的情况p-LRPtr=XorP(p.LRPtr,r);r-LRPtr=p;L.left=r;return OK;j=1;q=p-LRPtr;/当插入点在中间的情况while(+jLRPtr,pre);pre=p;p=q;/while/在 p,q 两结点之间插入if(!q)return INFEASIBLE;/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 语言版 习题集 答案
限制150内