(c语言)02-线性结构1 两个有序链表序列的合并 (15分)(详细讲解)
2020-03-31 08:09
627 查看
本试验取材于PTA。
拿到此题目,先要慌张一下,这是为啥,链表合并?思路到底是什么?怎么写,如何实现?已经疯掉了?千万振作。
typedef int ElementType; typedef struct Node *PtrToNode; struct Node { ElementType Data; PtrToNode Next; }; typedef PtrToNode List;
先把链表内容回忆一遍,有一个数据,有一个存放地址叫做单链表,它的插入和删除比较方便,因此这道题目的考点就在于链表的插入,并且题目还给你安慰,已经是递增序列的单链表!这不是大大给你启发,因此写好代码的关键,就在于理解题目
List Merge( List L1, List L2 ) { List pa,pb,pc,L; //pc 是 L的备胎 L是要甩出去的结点 //pa是接受传进的L1 pb是接受传进的L2 L = (List)malloc(sizeof(PtrToNode)); pa = L1->Next;//开局就接受,因为这是带头结点,他想要避开头结点 pb = L2->Next;//开局跟pa同样的道理 pc = L; while(pa && pb){ if(pa->Data <= pb->Data) { pc->Next = pa; pc = pa; pa = pa->Next; }else{ pc->Next = pb; pc = pb; pb = pb->Next; } } //做善后处理,将最后的没有解决的,解决掉 pc->Next = pa?pa:pb; L1->Next = NULL; L2->Next = NULL; return L; }
其实大家不要忘记,通过这段代码可以完全在线一个插入过程怎么来的,为什么要申请变量去装配他,为什么要既有Next赋给同一个变量,这都是可以思考的,这段代码主要模拟
这样子的情形,假设我要插入2,我要将L1的第一个解点的next指向2但是第一个解点的指向3丢了怎么半,因此就需要三个变量,这也是插入的核心情形!
List pa,pb,pc,L; //pc 是 L的备胎 L是要甩出去的结点 //pa是接受传进的L1 pb是接受传进的L2 L = (List)malloc(sizeof(PtrToNode)); pa = L1->Next;//开局就接受,因为这是带头结点,他想要避开头结点 pb = L2->Next;//开局跟pa同样的道理 pc = L; while(pa && pb){ if(pa->Data <= pb->Data) { pc->Next = pa; pc = pa; pa = pa->Next; }else{ pc->Next = pb; pc = pb; pb = pb->Next; } }
这段代码就是赋值的过程,尤其是在跟数据比较的情形,好到一定要背下来,才能体会用意深刻的地方。
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 02-线性结构1 两个有序链表序列的合并 (15分)
- 02-线性结构1 两个有序链表序列的合并 (15分)
- 02-线性结构1 两个有序链表序列的合并 (15分)
- 02-线性结构1 两个有序链表序列的合并 (15分)
- 02-线性结构1 两个有序链表序列的合并 (15分)
- 02-线性结构1 两个有序链表序列的合并 (15分)
- 02-线性结构1 两个有序链表序列的合并 (15分)
- 02-线性结构1 两个有序链表序列的合并 (15分)
- 02-线性结构1 两个有序链表序列的合并 (15分)
- 02-线性结构1 两个有序链表序列的合并 (15分)
- PAT数据结构_02-线性结构1 两个有序链表序列的合并 (15分)
- 02-线性结构1 两个有序链表序列的合并 (15分)
- 02-线性结构1 两个有序链表序列的合并 (15分)
- 02-线性结构1 两个有序链表序列的合并
- 02-线性结构1 两个有序链表序列的合并 (15分)
- 数据结构 02-线性结构1 两个有序链表序列的合并
- 02-线性结构1 两个有序链表序列的合并(15 分)
- 02-线性结构1 两个有序链表序列的合并(15 分)
- 02-线性结构1 两个有序链表序列的合并
- [数据结构]02-线性结构1 两个有序链表序列的合并