1、链表的归并
参考书:《数据结构(C语言)》–严蔚敏等编著,清华大学出版社。
将两个递增的有头链表L1和L2归并为一个递增的有头链表L1如下:
相关代码:
#include "stdio.h"
#include "stdlib.h"
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
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 = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
return OK;
}
Status CreateList(LinkList &L,int n);
//插入节点值n
Status CreateList(LinkList &L,int n) {
LinkList p,q;
p = L;
while(p->next != NULL)
p = p->next; //定位最后一个节点
q = new LNode;
q->data = n;
q->next = NULL;
p->next = q;
return OK;
}
Status MergeList(LinkList &L1,LinkList &L2);
//两个有序链表L1和L2归并为一个有序链表L1
Status MergeList(LinkList &L1,LinkList &L2) {
LinkList p1,p2,p3;
p1 = L1->next;
p2 = L2->next;
p3 = L1;
while(p1 && p2) {
if(p1->data >= p2->data) {
p3->next = p2;
p3 = p3->next;
p2 = p2->next;
}
else {
p3->next = p1;
p3 = p3->next;
p1 = p1->next;
}
}
p3->next = p1 ? p1 : p2; //插入剩余节点
free(L2);
return OK;
}
Status ListPrint(LNode *L);
//打印链表
Status ListPrint(LNode *L) {
LNode *p;
p=L->next; //p指向头结点
if(p == NULL) exit(OVERFLOW);
else {
while(p != NULL) {
if(p->next != NULL)
printf("%d,",p->data);
else {
printf("%d",p->data);
}
p=p->next; //p指针后移
}
}
}
int main(void) {
LinkList L1,L2;
InitList(L1);
InitList(L2);
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);
printf("\n归并后的L1有序链表为:");
ListPrint(L1);
return 0;
}