两个有序链表的合并


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

这次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