需求:两个长度不同的升序链表,将他们合并为一个降序链表
思路:新建一个链表用于存放降序链表,两两比较两个升序链表中的元素,取较小元素使用头插法插入新链表,指针后移一位…当其中一个链表遍历完后,剩下的另一个链表的剩余部分由于是升序链表,可以直接遍历剩余部分使用头插法插入新链表
代码实现:
#include <stdio.h>
#include <stdlib.h>
//定义节点的结构
typedef struct LNode {
int data;
struct LNode *next;
}LNode, *LinkList;
//初始化节点,分配内存空间
bool InitLinkList(LinkList &L){
L = (LNode *)malloc(sizeof(LNode));
if(L == NULL){
return false;
}
L->next = NULL;
return true;
}
//尾插法建立链表,换行输入整数,输入-1完成输入
LinkList List_TailInsert(LinkList &L){
LinkList a, b;
InitLinkList(L);
a = L;
int e;
printf("输入整数,输入-1结束:\n");
scanf("%d", &e);
while(e != -1){
InitLinkList(b);
b->data = e;
a->next = b;
a = b;
scanf("%d", &e);
}
a->next = NULL;
return L;
}
//头插法建立链表,换行输入整数,输入-1完成输入
LinkList List_HeadInsert(LinkList &L){
LinkList a;
InitLinkList(L);
int e;
printf("输入整数,输入-1结束:\n");
scanf("%d", &e);
while(e != -1){
InitLinkList(a);
a->data = e;
a->next = L->next;
L->next = a;
scanf("%d", &e);
}
return L;
}
//销毁链表,释放分配的内存空间
void DestroyLinkList(LinkList &L){
printf("开始销毁链表\n");
while(L != NULL){
LinkList p = L;
L = L->next;
free(p);
}
printf("链表已经销毁\n");
}
//打印链表数据元素
void PrintLinkList(LinkList L){
printf("打印如下:\n");
while(L != NULL){
printf("%d\n", L->data);
L = L->next;
}
}
//合并两个升序链表,返回降序链表
LinkList MergeLinkList(LinkList &A, LinkList B, LinkList C){
LinkList p, s, e, f;
p = A;
s = B->next;
e = C ->next;
while (s != NULL && e !=NULL)
{
if(s->data <= e->data){
f = s;
s = s->next;
f->next = p->next;
p->next = f;
}else{
f = e;
e = e->next;
f->next = p->next;
p->next = f;
}
}
if(s != NULL){
while (s != NULL)
{
f = s;
s = s->next;
f->next = p->next;
p->next = f;
}
}else{
while (e != NULL)
{
f = e;
e = e->next;
f->next = p->next;
p->next = f;
}
}
return A;
}
//程序入口
int main(){
LinkList A, B, C;
InitLinkList(A);InitLinkList(B);InitLinkList(C);
//链表A,B为升序链表,采用尾插法建立,输入是按从小到大输入
B = List_TailInsert(B);
C = List_TailInsert(C);
PrintLinkList(B);PrintLinkList(C);
A = MergeLinkList(A, B, C);
PrintLinkList(A);
DestroyLinkList(A);DestroyLinkList(B);DestroyLinkList(C);
PrintLinkList(A);
return 0;
}