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

来源:互联网 发布:李红涛 浙江大学知乎 编辑:程序博客网 时间:2024/05/23 02:02

有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;
}