1、链表递增归并为递减
参考书:《数据结构(C语言)》–严蔚敏等编著,清华大学出版社。
相关代码:
#include "stdio.h"
#include "stdlib.h"
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode *next;
} LNode, *LinkList;
Status InitList(LinkList &L);
Status InitList(LinkList &L) {
L = new LNode;
L->next = NULL;
return OK;
}
Status CreateList(LinkList &L,int n);
Status CreateList(LinkList &L,int n) {
LinkList p,q;
q = L;
while(q->next != NULL)
q = q->next;
p = new LNode;
p->data = n;
p->next = NULL;
q->next = p;
return OK;
}
Status MergeList(LinkList &L1,LinkList &L2,LinkList &L);
//归并两个递增有序链表为一个递减有序链表L
Status MergeList(LinkList &L1,LinkList &L2,LinkList &L) {
LinkList p1,p2,p;
p1 = L1->next;
p2 = L2->next;
L = new LNode;
L->next = NULL;
p = L;
while(p1 && p2) {
if(p1->data >= p2->data) {
LinkList pa=new LNode; //采用头插入L中
pa->data = p2->data;
pa->next = p->next;
p->next = pa;
p2 = p2->next;
} else {
LinkList pb=new LNode; //采用头插入L中
pb->data = p1->data;
pb->next = p->next;
p->next = pb;
p1 = p1->next;
}
}
LinkList pc = new LNode;
while(p1){ //若p1剩余,则持续插入L中
pc->data = p1->data;
pc->next = p->next;
p->next = pc;
p1 = p1->next;
}
while(p2){ //若p2剩余,则持续插入L中
pc->data = p2->data;
pc->next = p->next;
p->next = pc;
p2 = p2->next;
}
free(L1);
free(L2);
return OK;
}
Status ListPrint(LNode *L);
Status ListPrint(LNode *L) {
LinkList p;
p = L->next;
while(p) {
if(p->next != NULL)
printf("%d,",p->data);
else
printf("%d",p->data);
p = p->next;
}
return OK;
}
int main(void) {
LinkList L1,L2,L;
InitList(L1);
InitList(L2);
InitList(L);
CreateList(L1,5);
CreateList(L1,7);
CreateList(L2,2);
CreateList(L2,4);
CreateList(L2,6);
CreateList(L2,10);
printf("L1递增链表为:");
ListPrint(L1);
printf("\nL2递增链表为:");
ListPrint(L2);
MergeList(L1,L2,L);
printf("\n递减归并后的L链表为:");
ListPrint(L);
return 0;
}