#include <iostream>
#include <stdlib.h>
using namespace std;
typedef struct Node
{
int data;
struct Node *next;
} Node;
typedef Node *LinkList;
void ShowList(LinkList &L)
{
// 用于展示整个链表的函数
Node *p = L->next;
while (p)
{
printf("->%d", p->data);
p = p->next;
}
printf("->NULL");
printf("\n\n");
}
int InitList(LinkList &L)
{
// 完成对链表的初始化
L = (LinkList)malloc(sizeof(Node));
if (!L)
{
printf("内存分配失败!");
exit(0);
}
L->next = NULL;
return 0;
}
void CreateList(LinkList &L)
{
// 根据用户的输入来创建一个链表
int n;
InitList(L);
printf("请输入需要创建的链表的元素个数:");
scanf("%d", &n);
printf("请依次输入链表的元素值,以空格分隔:");
LinkList s = L, p;
for (int i = 0; i < n; i++)
{
p = (LinkList)malloc(sizeof(Node));
scanf("%d", &p->data);
s->next = p;
s = s->next;
}
L->data = n;
s->next = NULL;
ShowList(L);
}
void MergeList(LinkList &La, LinkList &Lb, LinkList &Lc)
{
// 已知单链表 La 和 Lb 的元素按值非递减排列
// 归并 La 和 Lb 得到新的单链表 Lc,Lc 也按非递减排列
Node *pa, *pb, *pc;
pa = La->next;
pb = Lb->next;
Lc = La; // 用 La 的头结点作为 Lc 的头结点
pc = Lc;
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 == nullptr) ? pa : pb; // 插剩余结点
free(Lb); // 释放 Lb的头结点
}
int main()
{
LinkList La, Lb, Lc;
printf("创建单链表La:\n");
CreateList(La);
printf("创建单链表Lb:\n");
CreateList(Lb);
MergeList(La, Lb, Lc);
printf("合并好的链表:");
ShowList(Lc);
return 0;
}
两个链表归并
最新推荐文章于 2024-09-28 09:18:19 发布