在学数据结构之前,也写过 这个操作,当时是先把两个表连起来,然后把数据导到数组里,用数组的排序方法,排完后再放到链表里。
这次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 }