教材第二章部分习题参考解答

上传人:mg****85 文档编号:36990182 上传时间:2018-04-05 格式:DOC 页数:12 大小:84KB
返回 下载 相关 举报
教材第二章部分习题参考解答_第1页
第1页 / 共12页
教材第二章部分习题参考解答_第2页
第2页 / 共12页
教材第二章部分习题参考解答_第3页
第3页 / 共12页
教材第二章部分习题参考解答_第4页
第4页 / 共12页
教材第二章部分习题参考解答_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《教材第二章部分习题参考解答》由会员分享,可在线阅读,更多相关《教材第二章部分习题参考解答(12页珍藏版)》请在金锄头文库上搜索。

1、教材第二章部分习题参考解答教材第二章部分习题参考解答一、单选题1. B 2. A 3. C 4. B 5. D 6. C二、填空题1值 指针2(38,56,25,60,42,74)3. O(n) O(1)4. O(1) O(n)5. i-1 i+16. p-next ap.next7. 表头8前驱 后继9表尾 表头10HL-next=NULL HL-next=HL11. ai.next=a1.next; a1.next=i;12. i=a1.next; a1.next=ai.next;13. p=ai.next; ai.next=ap.next; i=p;14. aj.next=ai.next

2、; ai.next=j; 三、普通题第 1 小题1. (79, 62, 34, 57, 26, 48) 2. (26, 34, 48, 57, 62, 79) 3. (48, 56, 57, 62, 79, 34) 4. (56, 57, 79, 34) 5. (26, 34, 39, 48, 57, 62) 第 2 小题分析:为了排版方便,假定采用以下输出格式表示单链表示意图:每个括号内的数据 表示一个元素结点,其中第一个数据为元素值,第二个数据为后继结点的指针,第一个元 素结点前的数值为表头指针。1. (7(79,6), (62,5), (34,4), (57,3), (26,2), (4

3、8,0) 2. (3(26,5), (34,2), (48,4), (57,6), (62,7), (79,0) 3. (2(48,8), (56,4), (57,6), (62,7), (79,5), (34,0) 4. (8(56,4), (57,7), (79,5), (34,0) 第 3 小题1. ElemType DMValue(List j-)L.listj+1=L.listj;L.listi-1=x;L.size+;4. void Delete2(Listwhile(i=s) /p 指向下一个待逆序的结点。/将 q 结点插入到已逆序单链表的表头。q-next=HL; HL=q;2

4、. void Delete1(LNode*j+;if(cp=NULL) cerrnext;elseap-next=cp-next;delete cp;3. ElemType MaxValue(LNode* HL)/从单链表中查找出所有元素的最大值,该值由函数返回。if(HL=NULL) cerrdata;LNode* p=HL-next;while(p!=NULL) if (maxdata) max=p-data;p=p-next;return max;4. int Count(LNode* HL, ElemType x)/统计出单链表中结点的值等于给定值 x 的结点数。 int n=0;wh

5、ile(HL!=NULL) if(HL-data=x) n+;HL=HL-next;return n;5. void Create(LNode*for(int i=n-1; i=0; i-)InsertFront(HL,ai);6. void OrderList(LNode* /p 指向待处理的第一个结点,初始指向原表头结点。HL=NULL; /HL 仍为待建立的有序表的表头指针,初始值为空。while(p!=NULL) /把原单链表中的结点依次进行有序链接。LNode* q=p; /q 指向待处理的结点。p=p-next; /p 指向下一个待处理的结点。LNode *ap=NULL, *cp

6、=HL;/cp 指向有序表中待比较的结点,ap 指向其前驱结点。while(cp!=NULL) /为插入 q 结点寻找插入位置。if(q-datadata)break;else ap=cp;cp=cp-next;/将 q 结点插入到 ap 和 cp 结点之间。q-next=cp;if(ap=NULL) HL=q;elseap-next=q;7. LNode* Merge1(LNode* /a 结点作为结果有序单链表的表头附加结点,这样/便于处理, 处理结束后返回 a 结点的指针域的值。LNode* p= /p 指向结果有序单链表的表尾结点,p-next=NULL; /初始指向表头附加结点。wh

7、ile(p1!=NULL) p1=p1-next;else p-next=p2; p2=p2-next;p=p-next;if(p1!=NULL) p-next=p1;if(p2!=NULL) p-next=p2;p1=p2=NULL;return a.next;8. LNode* Merge2(LNode* p1, LNode* p2)/根据两个有序单链表生成一个新的有序单链表。LNode a; /用 a 作为新的有序单链表的表头附加结点。LNode* p= /p 指向结果有序单链表的表尾结点,p-next=NULL; /初始指向表头附加结点。while(p1!=NULL)if(p1-dat

8、adata) /由 p1-data 建立新结点,然后 p1 指针后移。newptr-data=p1-data;p1=p1-next;else /由 p2-data 建立新结点,然后 p2 指针后移。newptr-data=p2-data;p2=p2-next;/将 newptr 结点插入到结果有序表的表尾。p-next=newptr;p=newptr;while(p1!=NULL) /继续处理 p1 单链表中剩余的结点。LNode* newptr=new LNode;newptr-data=p1-data;p1=p1-next;p-next=newptr;p=newptr;while(p2!=

9、NULL) /继续处理 p2 单链表中剩余的结点。LNode* newptr=new LNode;newptr-data=p2-data;p2=p2-next;p-next=newptr;p=newptr;p-next=NULL;return a.next;9. void Separate(LNode* HL, LNode* /a 和 b 结点分别作为 p1 和 p2 单链表的表头附加结点。LNode *t1= /t1 和 t2 分别作为指向 p1 和 p2 单链表/的表尾结点,初始指向表头附加结点。LNode* p=HL;while(p!=NULL) /每循环一次产生一个新结点,并把它加入到

10、/p1 或 p2 单链表的末尾。LNode* newptr=new LNode;if(p-data%2=1) newptr-data=p-data;t1-next=newptr;t1=newptr;else newptr-data=p-data;t2-next=newptr;t2=newptr;p=p-next;t1-next=t2-next=NULL;p1=a.next; p2=b.next; /把指向两个单链表的表头结点的/指针分别赋给 p1 和 p2 返回。 第 6 小题参考算法如下:void Josephus(int n, int m, int s)/使用带表头附加结点的循环单链表解决

11、约瑟夫问题。/生成表头附加结点,此时循环单链表为空。LNode* HL=new LNode;HL-next=HL;int i;/生成含有 n 个结点的、结点值依次为 1,2,.,n 的带表头附加结点/的循环单链表。for(i=n; i=1; i-) /生成新结点。LNode* newptr=new LNode;newptr-data=i;/把新结点插入到表头。newptr-next=HL-next;HL-next=newptr;/从表头开始顺序查找出第 s 个结点,对应第一个开始报数的人。LNode *ap=HL, *cp=HL-next;for(i=1; inext;/若 cp 指向了表头附

12、加结点,则仍需后移 ap 和 cp 指针,/使之指向表头结点。if(cp=HL) ap=HL; cp=HL-next; /依次使 n-1 个人出列。for(i=1; inext;if(cp=HL) ap=HL; cp=HL-next; /输出 cp 结点的值,即出列的人。coutdatanext=cp-next;delete cp;/使 cp 指针指向被删除结点的后继结点。cp=ap-next;/若 cp 指向了表头附加结点,则后移 ap 和 cp 指针。if(cp=HL) ap=HL; cp=HL-next; /使最后一个人出列。coutnext-datanext;delete HL;第 9

13、 小题参考算法如下:void OrderList(SLNode* SL)/假定 SLNode 类型为按题目要求所定义的结点类型,SL 为指向/表头附加结点的指针。SL-range=NULL;for(SLNode* p=SL-next; p!=NULL; p=p-next) /每循环一次把 p 所指向的结点按序插入到以 range 域/链接的有序表中SLNode *ap, *cp;/为 p 结点寻找合适的插入位置。ap=SL; cp=ap-range;while(cp!=NULL)if(p-datadata)break;else ap=cp;cp=cp-range;/插入位置在 ap 和 cp

14、之间,把 p 结点插入其中。p-range=cp;ap-range=p;第 10 小题参考程序如下:/lx2-7.cpp#include#includetypedef int ElemType; /规定元素类型为整型。struct SLNode /定义单链表结点。ElemType data;SLNode* next;SLNode* range;void OrderList(SLNode* SL)SL-range=NULL;for(SLNode* p=SL-next; p!=NULL; p=p-next) SLNode *ap, *cp;/为 p 结点寻找合适的插入位置。ap=SL; cp=ap

15、-range;while(cp!=NULL)if(p-datadata)break;else ap=cp;cp=cp-range;/插入位置在 ap 和 cp 之间,把 p 结点插入其中。p-range=cp;ap-range=p;void main()/按 next 域链接生成具有 10 个整数元素结点的链表。SLNode* a=new SLNode;a-next=NULL;int i;SLNode* p;for(i=0; idata=rand()%30; /假定产生 30 以内的随机整数。p-next=a-next;a-next=p;/按 next 域链接的次序输出单链表。for(p=a-next; p!=NULL; p=p-next)coutdatarange; p!=NULL; p=p-range)coutdata“ “;coutendl;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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

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