zoukankan      html  css  js  c++  java
  • 已有a,b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列

    1.我的思路先将b链表连接在a链表的后面,这个很容易实现,将a链表最后的结点中的p.next改为指向b链表的头结点即可。

    再将这个新链表用选择排序即可。

    代码如下:

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<malloc.h>
     4 
     5 typedef struct student{
     6     int num;
     7     float score;
     8     struct student *next;
     9 } STU;
    10 
    11 int main(){
    12     setbuf(stdout,NULL);
    13     STU *creat();
    14     void print(STU *head);
    15     STU *head_a,*head_b,*p1,*p2,*pmin;
    16     int num_temp;
    17     float score_temp;
    18     printf("Input the records of a:
    ");
    19     head_a=creat();
    20     printf("a:
    ");
    21     print(head_a);
    22     printf("Input the records of b:
    ");
    23     head_b=creat();
    24     printf("b:
    ");
    25     print(head_b);
    26   
    27     for(p1=head_a;p1!=NULL;p1=p1->next)    //27~29行连接两个链表。
    28         p2=p1;
    29     p2->next=head_b;
    30 
    31     printf("After connected:
    ");
    32     print(head_a);
    33 
    34     for(p1=head_a;p1->next!=NULL;p1=p1->next)
    35     {
    36         pmin=p1;
    37         for(p2=p1->next;p2!=NULL;p2=p2->next)
    38             if(p2->num<pmin->num)
    39                 pmin=p2;
    40         if(pmin!=p1)
    41         {
    42             num_temp=p1->num;
    43             p1->num=pmin->num;
    44             pmin->num=num_temp;
    45 
    46             score_temp=p1->score;
    47             p1->score=pmin->score;
    48             pmin->score=score_temp;
    49         }
    50     }
    51     printf("After sorted:
    ");
    52     print(head_a);
    53     return 0;
    54 }
    55 
    56 STU *creat(){
    57     STU *p1,*p2,*head=NULL;
    58     int n=0;
    59     p1=(STU *)malloc(sizeof(STU));
    60     p2=p1;
    61     scanf("%d%f",&p1->num,&p1->score);
    62     while(p1->num!=0)
    63     {
    64         n++;
    65         if(n==1)
    66             head=p1;
    67         else
    68             p2->next=p1;
    69         p2=p1;
    70         p1=(STU *)malloc(sizeof(STU));
    71         scanf("%d%f",&p1->num,&p1->score);
    72     }
    73     p2->next=NULL;
    74     return head;
    75 }
    76 
    77 void print(STU *head){
    78     STU *p1;
    79     if(head==NULL)
    80     {
    81         printf("NULL list!
    ");
    82         return;
    83     }
    84     else
    85     {
    86         for(p1=head;p1!=NULL;p1=p1->next)
    87             printf("%d,%.2f
    ",p1->num,p1->score);
    88     }
    89 }

    注意事项:

    1.用选择法进行排序的过程中,需要交换两个结点时,注意只能交换结点中的有用数据,结点中的next成员不能变动,否则会影响链表的连接关系;

    2.建立链表的函数中,head一定要初始化为NULL。否则当建立的链表为空链表时,return head返回的值为不确定的值。

    程序的执行结果如下:

    Input the records of a:
    110 85
    130 96
    150 75
    0 0
    a:
    110,85.00
    130,96.00
    150,75.00
    Input the records of b:
    100 96
    120 75
    140 96
    0 0
    b:
    100,96.00
    120,75.00
    140,96.00
    After connected:
    110,85.00
    130,96.00
    150,75.00
    100,96.00
    120,75.00
    140,96.00
    After sorted:
    100,96.00
    110,85.00
    120,75.00
    130,96.00
    140,96.00
    150,75.00

     2.谭浩强答案书上时这样处理的:

     1 STU *insert(STU *head_a,STU *head_b){
     2     STU *pa1,*pa2,*pb1,*pb2;
     3     pa2=pa1=head_a;
     4     pb2=pb1=head_b;
     5     do{
     6         while((pb1->num>pa1->num)&&(pa1->next!=NULL))
     7         {
     8             pa2=pa1;
     9             pa1=pa1->next;
    10         }
    11         if(pb1->num<=pa1->num)
    12         {
    13             if(head_a==pa1)
    14                 head_a=pb1;
    15             else
    16                 pa2->next=pb1;
    17             pb1=pb1->next;
    18             pb2->next=pa1;
    19             pa2=pb2;
    20             pb2=pb1;
    21         }
    22     }while((pa1->next!=NULL)||(pa1==NULL&&pb1!=NULL));
    23     if((pb1!=NULL)&&(pb1->num>pa1->num)&&(pa1->next==NULL))
    24         pa1->next=pb1;
    25     return(head_a);
    26 }

    将a链表和b链表传递给函数insert,函数的算法是将b链表中的结点依次插入a链表中,插入的时候按照学号的顺序。算法的细节我还没有理解。

  • 相关阅读:
    理解C#系列 / 核心C# / 常量
    理解C#系列 / 核心C# / 变量
    理解C#系列 / C#语言的特性
    理解C#系列 / .NET体系结构
    利用DMZ对象保护全局变量
    随手翻的一道摩拜校招题
    关于为函数形参赋值和搜索变量标识符的云云
    竟然修改形参有这么可怕的后果!!
    牛得一逼的delete操作符
    屏蔽属性
  • 原文地址:https://www.cnblogs.com/Camilo/p/3389934.html
Copyright © 2011-2022 走看看