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