兩個有序鏈表的合並


在學數據結構之前,也寫過 這個操作,當時是先把兩個表連起來,然后把數據導到數組里,用數組的排序方法,排完后再放到鏈表里。

這次pta作業上有這個題的編程題,周一上機的時候用新方法稀里糊塗的過了,但總覺得賦值的時候用的指針很亂,今天從新寫了一次,在賦值的時候,參考了輸入函數的

方法,用cur指針存數據,然后連到rear指針上,rear指針后移,多加了兩個指針,感覺思路清晰了不少。

 

附:在iPad上畫的也許只有自己理解的草圖

縮小的有點狠了

代碼是這樣的:

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<malloc.h>
  4 
  5 #define OK 1
  6 #define ERROR 0
  7 #define OVERFLOW -2
  8 
  9 typedef int ElemType;
 10 typedef int Status;
 11 
 12 typedef struct LNode
 13 {
 14     ElemType data;//數據域
 15     LNode *next;//指針域
 16 }LNode,*LinkList;//線性表的鏈式存儲結構
 17 
 18 //創建表:先初始化,再輸入元素
 19 Status ListCreate_L(LinkList &L)
 20 {
 21     //初始化
 22     L=(LNode *)malloc(sizeof(LNode));//開辟一個結點
 23     if(!L) exit(OVERFLOW);
 24     L->next=NULL;//首元結點賦空
 25     //賦值
 26     LNode *cur,*rear;
 27     rear=L;
 28     int a;//為了避免多開空間,所以用了個變量a
 29     scanf("%d",&a);
 30     while(a!=-1)
 31     {
 32         cur=(LNode *)malloc(sizeof(LNode));
 33         if(!cur) exit(OVERFLOW);
 34         cur->data=a;
 35         rear->next=cur;
 36         cur->next=NULL;
 37         rear=cur;
 38         scanf("%d",&a);
 39     }
 40 
 41     return OK;
 42 
 43 
 44 }
 45 
 46 //連接成新的有序表:用頭開始兩個比較,小的放到新表里,兩個指針后移,當一個表空時,剩下的連到后面去
 47 //注意:不用考慮空表
 48 LNode* UnitList_L(LinkList L1,LinkList L2)
 49 {
 50     LinkList L3,head;
 51     LNode *p,*q,*rear,*cur;
 52     p=L1->next; q=L2->next;
 53     L3=(LNode*)malloc(sizeof(LNode));
 54     L3->next=NULL;
 55     head=L3;
 56     rear=L3;
 57 
 58     while(p&&q)
 59     {
 60         cur=(LNode*)malloc(sizeof(LNode));
 61         if(p->data>q->data)//不能用*p和*q啦
 62         {
 63             cur->data=q->data;
 64             cur->next=NULL;
 65             q=q->next;
 66         }
 67         else
 68         {
 69             cur->data=p->data;
 70             cur->next=NULL;
 71             p=p->next;
 72         }
 73         rear->next=cur;
 74         rear=cur;
 75 
 76     }
 77     if(p)
 78     rear->next=p;
 79     if(q)
 80     rear->next=q;
 81 
 82     return head;
 83 
 84 
 85 }
 86 
 87 //打印:從首元節點開始打印
 88 //注意最后沒空格 空表
 89 void Print_L(LinkList L)
 90 {
 91     if(L->next==NULL)
 92     {
 93         printf("NULL");
 94         return;
 95     }
 96     LNode *p;
 97     p=L->next;
 98     while(p->next)
 99     {
100         printf("%d ",p->data);
101         p=p->next;
102     }
103     printf("%d",p->data);
104 
105 
106 
107 }
108 
109 int main()
110 {
111     LinkList L1;LinkList L2;
112     ListCreate_L(L1);
113     ListCreate_L(L2);
114 
115     Print_L(UnitList_L(L1,L2));
116     return 0;
117 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM