设为首页 加入收藏

TOP

将两个单向有序链表合并成一个单向有序链表
2017-10-10 12:15:36 】 浏览:4090
Tags:两个 单向 有序 合并 一个
  1 #include <stdio.h>  
  2 #include <stdlib.h>  
  3 #include <string.h>  
  4 typedef struct student                                                          //声明结构体  
  5 {  
  6     int num;  
  7     struct student *pnext;  
  8 }stu,*pstu;  
  9 void link_sort_insert(pstu *,pstu *,int);                                       //建立有序链表  
 10 void link_show(pstu );                                                           
 11 void link1_merge_link2(pstu *phead1,pstu *ptail1,pstu *phead2,pstu *ptail2);    //把链表2合并到1  
 12 void main(){  
 13     pstu phead1,ptail1,phead2,ptail2;  
 14     int i;  
 15     phead1 = NULL;  
 16     ptail1 = NULL;  
 17     phead2 = NULL;  
 18     ptail2 = NULL;    
 19     while(scanf("%d",&i) != EOF){                                               //建立链表1  
 20         link_sort_insert(&phead1,&ptail1,i);  
 21           
 22     }  
 23     link_show(phead1);  
 24     while(scanf("%d",&i) != EOF){                                               //建立链表2  
 25         link_sort_insert(&phead2,&ptail2,i);  
 26           
 27     }  
 28     link_show(phead2);  
 29     link1_merge_link2(&phead1,&ptail1,&phead2,&ptail2);                        //合并  
 30     link_show(phead1);                                                           
 31     system("pause");  
 32   
 33 }  
 34 void link_sort_insert(pstu *phead,pstu *ptail,int i){                            //建立有序链表  
 35     pstu pnew,pcur,ppre;  
 36     pnew = (pstu)malloc(sizeof(stu));  
 37     memset(pnew,0,sizeof(stu));  
 38     pnew->num = i;  
 39     if(*phead == NULL){  
 40         *phead = pnew;  
 41         *ptail = pnew;  
 42     }  
 43     else if((*phead)->num > i){  
 44         pnew->pnext = *phead;  
 45         *phead = pnew;  
 46           
 47     }  
 48     else{  
 49         pcur = *phead;  
 50         ppre = *phead;  
 51         while(pcur != NULL){  
 52             if(pcur->num > i){  
 53                 pnew->pnext = ppre->pnext;  
 54                 ppre->pnext = pnew;  
 55                 break;  
 56             }  
 57             ppre = pcur;  
 58             pcur = pcur->pnext;  
 59         }  
 60         if(pcur == NULL){  
 61         (*ptail)->pnext = pnew;  
 62         *ptail = pnew;  
 63         }  
 64     }  
 65       
 66 }  
 67 void link1_merge_link2(pstu *phead1,pstu *ptail1,pstu *phead2,pstu *ptail2){                   //把链表2合并到1  
 68     pstu i,ppre,pcur;  
 69     pcur = *phead1;                                                                         //pcur ppre 指向链表1头结点  
 70     ppre = *phead1;   
 71     while(*phead2 != NULL){      
 72         i = *phead2;                                                                      //记录链表2头结点的当前位置  
 73         *phead2 = (*phead2)->pnext;                                                       //链表头结点指向下1个结点  
 74         if((*phead1)->num > i->num){                                                      //判断链表1头结点是否大于i  
 75             i->pnext = *phead1;                                                       //如果大于,插入头结点  
 76             *phead1 = i;  
 77             pcur = *phead1;                                                           //pcur ppre 重新指向链表1头结点  
 78             ppre = *phead1;  
 79         }  
 80         else{                                                                             //链表1头结点不大于i  
 81             while(pcur != NULL){                                                           
 82                 if(pcur->num > i->num){                                           //判断链表1当前节点pcur是否大于i  
 83                     i->pnext = ppre->pnext;                                    //若大于i 则插入,循环结束,pcur不动  
 84                     ppre->pnext = i;  
 85                     break;  
 86                 }  
 87                 ppre = pcur;                                                        //若cur <=i 记录当前pcur,pcur指向下一个位置  
 88                 pcur = pcur->pnext;  
 89             }  
 90             if(pcur == NULL){                                                          //如果链表1达到尾结点,i插入到链表1尾节点  
 91                 (*ptail1)->pnext = i;   
 92                 *ptail1 = i;  
 93             }  
 94         }  
 95     }  
 96     *phead2 = NULL;                                                                           //释放  
 97     *ptail2 = NULL;  
 98 }  
 99 void link_show(pstu phead){  
100     pstu pshow;  
101     pshow = phead;  
102     if(phead == NULL)  
103     {  
104         printf("no exsit\n");  
105         return;  
106     }  
107     while(pshow != NULL){  
108         printf("%d ",pshow->num);  
109         pshow = pshow->pnext;  
110     }  
111     putchar('\n');  
112 }  

 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Swift中的数组 下一篇swift 代码添加image

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目