第2章作业答案
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(3) 继续将 La 或 Lb 其中一个表的剩余结点 插入在 Lc 表的表头结点之后
(4) 释放 Lb 表的表头结点
北京林业大学信息学院
La
q 12
第2题实现过程动态演示 pa q pa pa 23 q pb 32 43 48 54 34 45 56
Lb
q pb 11 ∧
Lc
∧
北京林业大学信息学院
作业
3.设计一个算法,通过一趟遍历在单链表中确定 值最大的结点。
思想类似于求n个数中的最大数,可假设第一个结点最 大,用指针pmax指向,然后用pmax依次和后面的结点 进行比较,发现大者则用pmax指向该结点,这样将链 表从头到尾遍历一遍时,pmax所指向的结点就是最大 者。 其中的比较语句形式如下: if(p->data > pmax->data) pmax=p;
void union(LinkList& La, LinkList& Lb, LinkList& Lc, ) { LinkList pa,pb,q; pa = La->next; pb = Lb->next; // 初始化 Lc=La; //用La的头结点作为Lc的头结点 Lc->next = NULL; while ( pa || pb ) { if ( !pa ) { q = pb; pb = pb->next; }//pa=NULL else if ( !pb ) { q = pa; pa = pa->next; } //pb=NULL else if (pa->data <= pb->data ) { q = pa; pa = pa->next; } else { q = pb; pb = pb->next; } q->next = Lc->next; Lc->next = q; // 插入 } free(Lb); //释放Lb的头结点 北京林业大学信息学院 }
北京林业大学信息学院
Fra Baidu bibliotek
北京林业大学信息学院
ElemType Max (LinkList L ){ LinkList pmax,p; if(L->next==NULL) return NULL; pmax=L->next; //假定第一个结点中数据具有最大值 p=L->next->next; while(p != NULL ){//如果下一个结点存在 if(p->data > pmax->data) pmax=p; p=p->next; } return pmax->data; }
北京林业大学信息学院
作业
4. 设计一个算法,通过遍历一趟,将链表中所有 结点的链接方向逆转,仍利用原表的存储空间。
算法的思想:从首元结点开始,逐个地把链表L的当前 结点p插入新的链表头部
(1)标志后继结点 (2)修改指针(将p插入在头结点之后) (3)重置结点p(p重新指向原表中后继)
北京林业大学信息学院
p L
a1 a3
succ p succ p succ p
a2 a3
L
a2
a1
(1)标志后继结点 (2)修改指针(将p插入在头结点之后) (3)重置结点p(p重新指向原表中后继)
北京林业大学信息学院
void inverse(LinkList &L) { // 逆置带头结点的单链表 L LinkList p,succ; p=L->next; L->next=NULL; while ( p) { succ=p->next; // succ指向*p的后继 p->next=L->next; L->next=p; // *p插入在头结点之后 p = succ; } }
作业
1.将两个非递减的有序链表合并为一个非递减的 有序链表。要求结果链表仍使用原来两个链表的 存储空间, 不另外占用其它的存储空间。表中不 允许有重复的数据。
北京林业大学信息学院
参考讲稿和教材中的算法2.12
La(Lc)
1
7
8
2
4
6
8
10
11
要单独考虑
pa->data = =pb->data
北京林业大学信息学院
void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc){ LinkList pc,p; pa=La->next; pb=Lb->next; Lc=pc=La; //用La的头结点作为Lc的头结点 while(pa && pb){ if(pa->data<pb->data){ pc->next=pa;pc=pa;pa=pa->next;} else if(pa->data>pb->data) {pc->next=pb; pc=pb; pb=pb->next;} else {// 相等时取La的元素,删除Lb的元素 pc->next=pa;pc=pa;pa=pa->next; p=pb; pb=pb->next; free( p );} pc->next=pa?pa:pb; //插入剩余段 free(Lb); //释放Lb的头结点 北京林业大学信息学院 }
作业
2.将两个非递减的有序链表合并为一个非递增 的有序链表。要求结果链表仍使用原来两个链 表的存储空间, 不另外占用其它的存储空间。 表中允许有重复的数据。
北京林业大学信息学院
参考讲稿和教材中的算法2.12,步骤如下:
(1)Lc指向La
(2) 依次从 La 或 Lb 中“摘取”元素值较小 的结点插入到 Lc 表的表头结点之后,直至其 中一个表变空为止
(4) 释放 Lb 表的表头结点
北京林业大学信息学院
La
q 12
第2题实现过程动态演示 pa q pa pa 23 q pb 32 43 48 54 34 45 56
Lb
q pb 11 ∧
Lc
∧
北京林业大学信息学院
作业
3.设计一个算法,通过一趟遍历在单链表中确定 值最大的结点。
思想类似于求n个数中的最大数,可假设第一个结点最 大,用指针pmax指向,然后用pmax依次和后面的结点 进行比较,发现大者则用pmax指向该结点,这样将链 表从头到尾遍历一遍时,pmax所指向的结点就是最大 者。 其中的比较语句形式如下: if(p->data > pmax->data) pmax=p;
void union(LinkList& La, LinkList& Lb, LinkList& Lc, ) { LinkList pa,pb,q; pa = La->next; pb = Lb->next; // 初始化 Lc=La; //用La的头结点作为Lc的头结点 Lc->next = NULL; while ( pa || pb ) { if ( !pa ) { q = pb; pb = pb->next; }//pa=NULL else if ( !pb ) { q = pa; pa = pa->next; } //pb=NULL else if (pa->data <= pb->data ) { q = pa; pa = pa->next; } else { q = pb; pb = pb->next; } q->next = Lc->next; Lc->next = q; // 插入 } free(Lb); //释放Lb的头结点 北京林业大学信息学院 }
北京林业大学信息学院
Fra Baidu bibliotek
北京林业大学信息学院
ElemType Max (LinkList L ){ LinkList pmax,p; if(L->next==NULL) return NULL; pmax=L->next; //假定第一个结点中数据具有最大值 p=L->next->next; while(p != NULL ){//如果下一个结点存在 if(p->data > pmax->data) pmax=p; p=p->next; } return pmax->data; }
北京林业大学信息学院
作业
4. 设计一个算法,通过遍历一趟,将链表中所有 结点的链接方向逆转,仍利用原表的存储空间。
算法的思想:从首元结点开始,逐个地把链表L的当前 结点p插入新的链表头部
(1)标志后继结点 (2)修改指针(将p插入在头结点之后) (3)重置结点p(p重新指向原表中后继)
北京林业大学信息学院
p L
a1 a3
succ p succ p succ p
a2 a3
L
a2
a1
(1)标志后继结点 (2)修改指针(将p插入在头结点之后) (3)重置结点p(p重新指向原表中后继)
北京林业大学信息学院
void inverse(LinkList &L) { // 逆置带头结点的单链表 L LinkList p,succ; p=L->next; L->next=NULL; while ( p) { succ=p->next; // succ指向*p的后继 p->next=L->next; L->next=p; // *p插入在头结点之后 p = succ; } }
作业
1.将两个非递减的有序链表合并为一个非递减的 有序链表。要求结果链表仍使用原来两个链表的 存储空间, 不另外占用其它的存储空间。表中不 允许有重复的数据。
北京林业大学信息学院
参考讲稿和教材中的算法2.12
La(Lc)
1
7
8
2
4
6
8
10
11
要单独考虑
pa->data = =pb->data
北京林业大学信息学院
void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc){ LinkList pc,p; pa=La->next; pb=Lb->next; Lc=pc=La; //用La的头结点作为Lc的头结点 while(pa && pb){ if(pa->data<pb->data){ pc->next=pa;pc=pa;pa=pa->next;} else if(pa->data>pb->data) {pc->next=pb; pc=pb; pb=pb->next;} else {// 相等时取La的元素,删除Lb的元素 pc->next=pa;pc=pa;pa=pa->next; p=pb; pb=pb->next; free( p );} pc->next=pa?pa:pb; //插入剩余段 free(Lb); //释放Lb的头结点 北京林业大学信息学院 }
作业
2.将两个非递减的有序链表合并为一个非递增 的有序链表。要求结果链表仍使用原来两个链 表的存储空间, 不另外占用其它的存储空间。 表中允许有重复的数据。
北京林业大学信息学院
参考讲稿和教材中的算法2.12,步骤如下:
(1)Lc指向La
(2) 依次从 La 或 Lb 中“摘取”元素值较小 的结点插入到 Lc 表的表头结点之后,直至其 中一个表变空为止