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

C程序设计(第四版) 谭浩强 习题9.10 个人设计

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

代码块:

#include <stdio.h>
#include <stdlib.h>
struct Student{                                             //定义结构体Student
    int num;
    float score;
    Student *next;
};
void input(Student *stu, int n);                            //定义输入函数
Student *merge(Student *stu1, Student *stu2, int m);        //定义合并函数,返回指针值
void print(Student *stu);                                   //定义输出函数
int main()
{
    Student a[3], b[2];
    input(a, 3);                                            //调用输入函数,生成a链表
    input(b, 2);                                            //调用输入函数,生成b链表
    print(merge(a, b, 3));                                  //调用输出函数,参数为合并函数返回指针值
    system("pause");
    return 0;
}
//输入函数
void input(Student *stu, int n)
{
    int i;
    Student *p;
    for (p=stu, i=0; p<stu+n; p++, i++){
        printf("Please enter No.%d student info; ", i+1);
        scanf("%d %f", &p->num, &p->score);
        i==n-1 ? p->next=NULL : p->next=&stu[i+1];
    }
}
//合并函数
Student *merge(Student *stu1, Student *stu2, int m)
{
    stu1[m-1].next=stu2;                         //将a链表最末尾的next指向b链表首地址
    Student *p, *q, temp;
    for (p=stu1; p!=NULL; p=p->next)             //排序法对链表总体排序,注意,交换时只交换结构体变量中的学号和成绩,next指针不交换改变,为了保持原链表的链接顺序。
        for (q=p->next; q!=NULL; q=q->next)
            if (p->num>q->num){
                temp.num=p->num;
                p->num=q->num;
                q->num=temp.num;
                temp.score=p->score;
                p->score=q->score;
                q->score=temp.score;
            }
    return stu1;
}
//输出函数
void print(Student *stu)
{
    Student *p;
    for (p=stu; p!=NULL; p=p->next)
        printf("%d %.2f\n", p->num, p->score);
}

猜你喜欢

转载自blog.csdn.net/navicheung/article/details/80998792