严蔚敏版数据结构(c语言版)参考答案第一至三章

上传人:ji****n 文档编号:46005786 上传时间:2018-06-20 格式:DOC 页数:26 大小:93KB
返回 下载 相关 举报
严蔚敏版数据结构(c语言版)参考答案第一至三章_第1页
第1页 / 共26页
严蔚敏版数据结构(c语言版)参考答案第一至三章_第2页
第2页 / 共26页
严蔚敏版数据结构(c语言版)参考答案第一至三章_第3页
第3页 / 共26页
严蔚敏版数据结构(c语言版)参考答案第一至三章_第4页
第4页 / 共26页
严蔚敏版数据结构(c语言版)参考答案第一至三章_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《严蔚敏版数据结构(c语言版)参考答案第一至三章》由会员分享,可在线阅读,更多相关《严蔚敏版数据结构(c语言版)参考答案第一至三章(26页珍藏版)》请在金锄头文库上搜索。

1、第一章 绪论 1.16 void print_descending(int x,int y,int z)/按从大到小顺序输出三个数 scanf(“%d,%d,%d“,if(xy; /为表示交换的双目运算符,以下同if(yz;if(xy; /冒泡排序printf(“%d %d %d“,x,y,z); /print_descending 1.17 Status fib(int k,int m,int if(ka.length) return INFEASIBLE;for(count=1;i+count-1va.listsize) return ERROR;va.length+;for(i=va.l

2、ength-1;va.elemixi-)va.elemi+1=va.elemi;va.elemi+1=x;return OK; /Insert_SqList 2.12 int ListComp(SqList A,SqList B)/比较字符表 A 和 B,并用返回值表示结果,值为正,表 示 AB;值为负,表示 Anext;pp=p-next);return p; /Locate 2.14 int Length(LinkList L)/求链表的长度 for(k=0,p=L;p-next;p=p-next,k+);return k; /Length 2.15 void ListConcat(Lin

3、kList ha,LinkList hb,LinkList p=ha;while(p-next) p=p-next;p-next=hb; /ListConcat 2.16 见书后答案. 2.17 Status Insert(LinkList q=(LinkList*)malloc(sizeof(LNode);q.data=b;if(i=1)q.next=p;L=q; /插入在链表头部elsewhile(-i1) p=p-next;q-next=p-next;p-next=q; /插入在第 i 个元素的位置 /Insert 2.18 Status Delete(LinkList /删除第一个元素

4、elsep=L;while(-i1) p=p-next;p-next=p-next-next; /删除第 i 个元素 /Delete 2.19 Status Delete_Between(Linklist while(p-next-datanext; /p 是最后一个不大于 mink 的元素if(p-next) /如果还有比 mink 更大的元素q=p-next;while(q-datanext; /q 是第一个不小于 maxk 的元素p-next=q; /Delete_Between 2.20 Status Delete_Equal(Linklist q=p-next; /p,q 指向相邻两

5、元素while(p-next)if(p-data!=q-data)p=p-next;q=p-next; /当相邻两元素不相等时,p,q 都向后推一步elsewhile(q-data=p-data) free(q);q=q-next; p-next=q;p=q;q=p-next; /当相邻元素相等时删除多余元素/else/while /Delete_Equal 2.21 void reverse(SqList iA.elemj; /reverse 2.22 void LinkList_reverse(Linklist 为简化算法,假设表长大于 2 p=L-next;q=p-next;s=q-ne

6、xt;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; /LinkList_reverse 分析:本算法的思想是,逐个地把 L 的当前元素 q 插入新的链表头部,p 为新表表 头. 2.23 void merge1(LinkList q=B-next;C=A;while(pp-next=q; /将 B 的元素插入if(s)t=q-next;q-next=s; /如 A 非空,将 A 的元素插入p=s;q=t;/while /merge1 2.24 voi

7、d reverse_merge(LinkList 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;A-next=pc; /构造新表头 /reverse_merge 分析:本算法的思想是,按从小到大的顺序依次把 A 和 B 的元素插入新表的头部 pc 处,最后处理 A 或 B 的剩余元素

8、. 2.25 void SqList_Intersect(SqList A,SqList B,SqList j=1;k=0;while(A.elemiif(A.elemi=B.elemj)C.elem+k=A.elemi; /当发现了一个在 A,B 中都存在的元素,i+;j+; /就添加到 C 中/while /SqList_Intersect 2.26 void LinkList_Intersect(LinkList A,LinkList B,LinkList q=B-next;pc=(LNode*)malloc(sizeof(LNode);while(pelse if(p-dataq-da

9、ta) q=q-next;elses=(LNode*)malloc(sizeof(LNode);s-data=p-data;pc-next=s;pc=s;p=p-next;q=q-next;/whileC=pc; /LinkList_Intersect 2.27 void SqList_Intersect_True(SqList j=1;k=0;while(A.elemielse if(A.elemi!=A.elemk)A.elem+k=A.elemi; /当发现了一个在 A,B 中都存在的元素i+;j+; /且 C 中没有,就添加到 C 中/whilewhile(A.elemk) A.ele

10、mk+=0; /SqList_Intersect_True 2.28 void LinkList_Intersect_True(LinkList q=B-next;pc=A;while(pelse 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_True 2.29 void SqList_Intersect_Delete(SqList j=0;k=0;m=0; /i 指示 A 中元素原来的位置,m 为移

11、动后的位置while(iC.elemk) k+;elsesame=B.elemj; /找到了相同元素 samewhile(B.elemj=same) j+;while(C.elemk=same) k+; /j,k 后移到新的元素while(inext;q=C-next;r=A-next;while(pelse 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-nex

12、t;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_Delete 2.31 Status Delete_Pre(CiLNode *s)/删除单循环链表中结点 s 的直接前驱 p=s;while(p-next-next!=s) p=p-next; /找到 s 的前驱的前驱 pp-next=s;return OK; /Delete_Pre 2.32 Status

13、DuLNode_Pre(DuLinkList !p-next-pre;p=p-next) p-next-pre=p;return OK; /DuLNode_Pre 2.33 Status LinkList_Divide(LinkList 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-

14、data)q-next=s;q=s;elser-next=s;r=s;/whilep-next=A;q-next=B;r-next=C; /完成循环链表 /LinkList_Divide 2.34 void 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_XorLinkedList 2.35

15、Status Insert_XorLinkedList(XorLinkedList 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; /i 不可以超过表长p-LRPtr=XorP(XorP(p-LRPtr,q),r);q-LRPtr=XorP(XorP(q-LRPtr,p),r);r-LRPtr=XorP(p,q); /修改指针return OK; /Insert_XorLinkedList 2

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号