• 将两个单向有序链表合并成一个单向有序链表


      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 }  
  • 相关阅读:
    操作系统进程通信
    操作系统进程调度
    java中的变量
    java移位运算符
    String, StringBuffer, StringBuilder 的区别
    多线程相关问题汇总
    java内存管理与GC机制(二)
    java内存管理与GC机制(一)
    进程与线程的理解
    Liferay7使用maven引入第三方jar包
  • 原文地址:https://www.cnblogs.com/boluo007/p/5470239.html
Copyright © 2020-2023  润新知