考察了指针 和链表的相关知识,用尾插法可以直接进行合并
将 有序的链表p1 和 p2 的头部比较值的大小,然后将比较后得出的头结点 插入到新链表的尾部,不断循环遍历,最后输出一个新链表
原理:需要新建两个链表p1和p2, 直接对原有的p1和p2两个链表进行操作,
用p1和p2的头部对 新链表 使用尾插法,
比较p1和p2的头部值,将 较大的头部插入 新链表 的尾部,同时对移走头部的链表进行头部删除
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct NUM {//定义一个结构体
int num;
struct NUM* pNext;
} num, * pnum;
//该子函数原理:
// 建立了一个新链表,用尾插法 将p1和p2两个链表插入到新链表的尾部,同时对移动的旧链表的结点删除
void insert(pnum *pphead,pnum *pptail,int Input) {
pnum pnew = (pnum)calloc(sizeof(num), 1);
memset(pnew, 0, sizeof(num));
pnew->num = Input;//指向 新输入的值
pnum pre = *pphead, pcur = *pphead;
if (NULL==*pphead) { //判断链表是否为空
//如果链表为空
*pphead = pnew;
*pptail = pnew;
}
else if(Input <=(*pphead)->num) {
(*pptail)->pNext = pnew;
*pptail = pnew;
}
else {
while (pcur !=NULL) {
if (pcur->num >Input) {
pnew->pNext = pcur;
pre->pNext = pnew;
break;
}
pre =pcur;
pcur = pcur->pNext;
}
if (NULL==pcur) {
pre->pNext = pnew;
*pptail = pnew;
}
}
}
//该子函数 是将链表合并
void merge(pnum *phead,pnum *ptail,pnum *phead1,pnum *phead2) {
pnum p1 = *phead1;
pnum p2 = *phead2;
while (p1 !=NULL &&p2 !=NULL) {
if (*phead==NULL) {
if (p1->num >p2->num) {
*phead = p2;
p2 = p2->pNext;
(*phead)->pNext = NULL;
*ptail = *phead;
}
else {
*phead = p1;
p1 = p1->pNext;
(*phead)->pNext = NULL;
*ptail = *phead;
}
}
else {
if (p1->num > p2->num) {
(*ptail)->pNext = p2;
*ptail = p2;
p2 = p2->pNext;
}
else {
(*ptail)->pNext = p1;
*ptail = p1;
p1 = p1->pNext;
}
}
}
if (p1) {
(*ptail)->pNext = p1;
while (p1->pNext) {
p1 = p1->pNext;
}
*ptail = p2;
}
if (p2) {
(*ptail)->pNext = p2;
while (p2->pNext) {
p2= p2->pNext;
}
*ptail = p1;
}
}
//该子函数 是为了打印链表 显示出最后结果
void print(pnum *phead) {
pnum pcur = *phead;
while (pcur) {
printf("%3d",pcur->num);
pcur = pcur->pNext;
}
printf("\n");
}
int main() {
pnum phead1 = NULL;//定义头指针 链表1
pnum ptail1 = NULL;//定义尾指针
pnum phead2 = NULL;//定义头指针 链表2
pnum ptail2 = NULL;//定义尾指针
pnum phead = NULL;//定义头指针 新链表用来放 其他两个链表
pnum ptail = NULL;//定义尾指针
int InPut;//定义要输入的数
while (scanf_s("%d", &InPut) != EOF) {
insert(&phead1,&ptail1,InPut);//调用子函数 在子函数中具体实现功能
}
printf("链表 1 如下:\n");
print(&phead1);
printf("=========================================\n");
while (scanf_s("%d", &InPut) != EOF) {
insert(&phead2, &ptail2, InPut);//调用子函数 在子函数中具体实现功能
}
printf("链表 2 如下:\n");
print(&phead2);
printf("=========================================\n");
merge(&phead,&ptail,&phead1,&phead2);
printf("合并后的新链表 如下:\n");
print(&phead);
return 0;
}
运行结果: