BJFU-225-基于链表的两个递增有序序列的合并
1 #include<stdio.h> 2 #include<stdlib.h> 3 typedef struct Lnode{ 4 int num; 5 struct Lnode * next; 6 }Lnode,*LinkList; 7 8 typedef struct Link{ 9 LinkList data; 10 struct Link * next; 11 }Link,*List; 12 void creatList(LinkList &L,int n) 13 { 14 L = (LinkList)malloc(sizeof(Lnode)); 15 L->next = NULL; 16 LinkList rear = L; 17 18 for(int i=1;i<=n;i++) 19 { 20 LinkList p = (LinkList)malloc(sizeof(Lnode)); 21 22 scanf("%d",&p->num); 23 rear->next = p; 24 p->next = NULL; 25 rear = p; 26 } 27 } 28 void traverse(LinkList L) 29 { 30 LinkList p = L->next; 31 while(p) 32 { 33 if(p->next==NULL) 34 { 35 printf("%d",p->num);//最后一个数字的输出不能有空格,不然编译通不过。不要问我为什么!!! 36 }else{ 37 printf("%d ",p->num); 38 } 39 40 p = p->next; 41 } 42 printf("\n"); 43 } 44 LinkList mergeList(LinkList La,LinkList Lb,int n,int m) 45 { 46 LinkList Lc,a,b,c; 47 Lc = La; 48 a = La->next; 49 b = Lb->next; 50 c = Lc; 51 52 while(a&&b) 53 { 54 if(a->num > b->num) 55 { 56 c->next = b; 57 c = b; 58 b = b->next; 59 }else if(a->num==b->num) 60 { 61 LinkList q = b; 62 c->next = a; 63 c = a; 64 a = a->next; 65 b = b->next; 66 free(q); 67 }else 68 { 69 c->next = a; 70 c = a; 71 a = a->next; 72 } 73 } 74 75 c->next = a?a:b; 76 free(Lb); 77 return Lc; 78 } 79 int main() 80 { 81 int n,m; 82 83 List Lc = (List)malloc(sizeof(Link)); 84 List r = Lc; 85 while(1) 86 { 87 scanf("%d%d",&n,&m); 88 if(n==0&&m==0) break; 89 LinkList La,Lb; 90 creatList(La,n); 91 creatList(Lb,m); 92 93 List pc = (List)malloc(sizeof(Link)); 94 LinkList Lc = mergeList(La,Lb,n,m); 95 pc->data = Lc; 96 r->next = pc; 97 r = pc; 98 pc->next = NULL; 99 100 } 101 List p = Lc->next; 102 while(p) 103 { 104 traverse(p->data); 105 p = p->next; 106 } 107 }