有a,b两个已按学号升序排序的链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,仍按学号升序排列。

    技术2022-05-20  45

    有a,b两个已按学号升序排序的链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,仍按学号升序排列。

    #include  < stdio.h > #include  < stdlib.h > #define  N 10 typedef  struct  student{     int  num;     float  score;     struct  student  * next;}STU;STU  * create(){     int  i;    STU  * p, * head = NULL, * tail = head;     for  (i = 0 ;i < N;i ++ )    {        p = (STU  * )malloc( sizeof (STU));        scanf( " %d%f " , & p -> num, & p -> score);        p -> next = NULL;         if  (p -> num < 0 )        {            free(p);             break ;        }         if (head == NULL)            head = p;         else             tail -> next = p;        tail = p;    }     return  head;} void  output(STU  * p){     while  (p != NULL)    {        printf( " %d/t%.2f/n " ,p -> num,p -> score);        p = p -> next;    }}STU  * link(STU  * p1,STU  * p2){    STU  * p, * head;     if  (p1 -> num < p2 -> num)    {        head = p = p1;        p1 = p1 -> next;    }     else     {        head = p = p2;        p2 = p2 -> next;    }     while  (p1 != NULL && p2 != NULL)    {         if  (p1 -> num < p2 -> num)        {            p -> next = p1;            p = p1;            p1 = p1 -> next;        }         else         {            p -> next = p2;            p = p2;            p2 = p2 -> next;        }    }     if (p1 != NULL)        p -> next = p1;     else         p -> next = p2;     return  head;} int  main( int  argc,  char   * argv[]) {    STU  * a, * b, * c;    printf( " /n请输入链表a的信息,学号小于零时结束输入:格式(学号 成绩)/n " );    a = create();    printf( " /n请输入链表b的信息,学号小于零时结束输入:格式(学号 成绩)/n " );    b = create();    printf( " /n链表a的信息为:/n " );    output(a);    printf( " /n链表b的信息为:/n " );    output(b);    c = link(a,b);    printf( " /n合并后的链表信息为:/n " );    output(c);     return   0 ;}

    最新回复(0)