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