有a,b兩個已按學號升序排序的連結串列,每個連結串列中的結點包括學號、成績。要求把兩個連結串列合併,仍按學號升序排列。...

weixin_34219944發表於2008-07-09
#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;
}

相關文章