C语言程序设计教程(第三版)课后习题11.8 链表合并及操作

题目描述

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

输入格式

第一行,a、b两个链表元素的数量N、M,用空格隔开。 接下来N行是a的数据 然后M行是b的数据 每行数据由学号和成绩两部分组成

输出

按照学号升序排列的数据

样例输入

2 3
5 100
6 89
3 82
4 95
2 10

样例输出

2 10
3 82
4 95
5 100
6 89

#include
#include
typedef struct student
{
    int a;
    int b;
    struct student *next;
} STU;

void change(STU *a,STU *b)
{
    a->next=b->next;
    b->next=a;
}
int main()
{
    int m,n;
    scanf("%d%d",&n,&m);
    int i,j,k,l;
    i=n;
    j=m;
    STU *q1,*q2,head1,head2,*p;
       q1=&head1;
       q2=&head2;
    while(i--)
    {
        p=(STU*)malloc(sizeof(STU));
        scanf("%d %d",&p->a,&p->b);
        q1->next=p;
        q1=q1->next;
    }
        while(j--)
    {
        p=(STU*)malloc(sizeof(STU));
        scanf("%d %d",&p->a,&p->b);
        q2->next=p;
        q2=q2->next;
    }
    q1->next=head2.next;
    STU *x,*y;
    for(x=head1.next; x!=NULL;x=x->next)
        for(y=x; y!=NULL;y=y->next)
        if(x->a>y->a)
    {
        int temp;
        temp=x->a;
        x->a=y->a;
        y->a=temp;
         temp=x->b;
        x->b=y->b;
        y->b=temp;
    }
    STU *g;
    g=head1.next;
    while(g!=NULL)
    {
        printf("%d ",g->a);
        printf("%d\n",g->b);
        g=g->next;
    }
    return 0;
}
中间使用选择排序操作排序问题,因为单链表的操作,在选择法中没法进行链表地址的交换(或者说比较麻烦)。

你可能感兴趣的:(算法总结)