两个有序链表合成一个有序链表

元气小坏坏 提交于 2020-03-19 12:03:06
 1 #include<iostream>
 2 #include<cstdlib>
 3 using namespace std;
 4 #define MAXa 5//La链表中的元素数量 
 5 #define MAXb 7//Lb链表中的元素数量 
 6 typedef struct node{//定义链表中的节点 
 7     int data;//存储数据 
 8     struct node *next;//存储指向下一个节点的指针 
 9 }Lnode;
10 void creatlist(Lnode *head, int *arr, int n);//创建链表 
11 void printlist(Lnode *head);//打印链表 
12 void mergelist(Lnode *headA, Lnode *headB, Lnode *headC);//合并链表 
13 int main(){
14     int a[MAXa] = { 1, 3, 5, 7, 9 };//先将元素存储到数组中,再存到链表中 
15     int b[MAXb] = { 2, 4, 6, 8, 10 ,11,45};
16     Lnode *La, *Lb, *Lc;//分别定义La链表、Lb链表、Lc链表的头节点 
17     La = (Lnode*)malloc(sizeof(Lnode));//动态分配空间 
18     La->next = NULL;//头节点中指针成员为空 
19     Lb = (Lnode*)malloc(sizeof(Lnode));//动态分配空间 
20     Lb->next = NULL;//头节点中指针成员为空 
21     Lc = (Lnode*)malloc(sizeof(Lnode));//动态分配空间 
22     Lc->next = NULL;//头节点中指针成员为空 
23     creatlist(La, a, MAXa);//创建链表La 
24     creatlist(Lb, b, MAXb);//创建链表Lb 
25     cout << "La链表合并前:";
26         printlist(La);//打印合并前的链表La 
27     cout << "Lb链表合并前:";
28         printlist(Lb);//打印合并前的链表Lb 
29     mergelist(La, Lb, Lc);//将La链表和Lb链表合并 ,存到Lc链表中 
30     cout << "La链表和Lb链表合并后:";
31         printlist(Lc);//打印Lc链表 
32     return 0;
33 }
34 void creatlist(Lnode *head, int *arr, int n){//尾插法创建链表 
35     Lnode *tail, *s;//定义一个尾指针,和s指针,s指针用来接受数组中的元素 
36     tail = head;//尾指针指向头指针 
37     for (int i = 0; i<n; i++){//将数组中的元素存到链表中 
38         s = (Lnode*)malloc(sizeof(Lnode));//给s分配一块空间 
39         s->data = arr[i];//将数组中的一个元素存到s所指向节点的data成员中 
40         s->next = NULL;// 将s所指向节点的指针成员置空 
41         tail->next = s;//尾指针所指向的节点的指针成员指向s所指向的节点 
42         tail = s;//尾指针指向s指针所指向的节点 
43     }
44 }
45 void printlist(Lnode *head){//打印链表 
46     Lnode *p = head->next;//p指向链表中的第一个元素 
47     if (p == NULL){//如果链表中没有元素
48         cout << "链表为空!";
49         return;
50     }
51     while (p != NULL){//当p不为空时 
52         cout << p->data << ' ';//输出p所指向节点的data成员和空格 
53         p = p->next;//p指向p所指向节点的指针成员所指向的节点 
54     }
55     cout << endl;//换行 
56 }
57 void mergelist(Lnode *headA, Lnode *headB, Lnode *headC){//合并链表 
58     Lnode *tail = headC;//定义尾指针指向headc所指向的节点 
59     Lnode *pa = headA->next;// 定义pa指向La链表头节点的下一个节点 
60     Lnode *pb = headB->next;//定义pb指向Lb链表头节点的下一个节点 
61     while ((pa != NULL) && (pb != NULL)){//当pa和pb都不为空时 
62         if (pa->data<pb->data){//如果pa所指向节点的data成员小于pb所指向节点的data成员 
63             tail->next = pa;//tail指针所指向的节点的指针成员指向pa所指向的节点 
64             pa = pa->next;//pa指针指向pa指针所指向的节点的指针成员所指向的节点 
65             tail = tail->next;//tail指向tail所指向节点的指针成员所指向的节点
66             //以上三步就是让pa所指向的节点连接到Lc链表后面 
67         }
68         else{ 
69             tail->next = pb;//tail指针所指向的节点的指针成员指向pb所指向的节点 
70             pb = pb->next;//pb指向pb所指向节点的指针成员所指向的节点 
71             tail = tail->next;//tail指针指向tail指针所指向节点指针成员所指向的节点 
72             //以上三步就是让pb所指向的节点连接到LC链表后面 
73         }
74     }
75     if (pa != NULL){//如果La链表还有元素没有加入到LC链表 
76         tail->next = pa;//将La链表剩余元素连接到Lc链表后 
77     }
78     if (pb != NULL){//如果Lb链表还有元素没有加入到Lc链表 
79         tail->next = pb;//将Lb链表剩余元素连接到Lc链表后 
80     }
81 }

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!