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

来源:互联网 发布:linux日常维护脚本 编辑:程序博客网 时间:2024/05/21 09:22

题目描述

已有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<stdio.h>#include<malloc.h>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;}
中间使用选择排序操作排序问题,因为单链表的操作,在选择法中没法进行链表地址的交换(或者说比较麻烦)。