您的位置:首页 > 编程语言 > C语言/C++

(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;
}
}

这段代码就是赋值的过程,尤其是在跟数据比较的情形,好到一定要背下来,才能体会用意深刻的地方。

  • 点赞
  • 收藏
  • 分享
  • 文章举报
执念斩长河 发布了68 篇原创文章 · 获赞 6 · 访问量 2097 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: