题目描述:建立一个链表,其每个节点代表一位学生的信息。信息从文件student.in中读取(文件student.in是外部已经存在文件,其格式为第一行是一个大于零的整数表示学生数量,以后每行表示一位学生的信息分别有学号、姓名、性别、年龄)。
要求:1. 求所有学生的平均年龄
2. 以姓名为标准按照字母表顺序对链表进行排序,输出排序后的学生姓名和学号
题目分析:本题主要考察c语言中的文件读写信息、链表创建和链表排序。
先介绍一下c语言中对文件操作的函数 :
(1)c语言中打开文件函数fopen(文件名,使用文件方式),关闭文件fclose(文件指针),其中文件读写方式主要 ①"r"只 读 ②"w"只写,如果指定文件不存在建立新文件③"r+"读写④"w+"读写,如果指定文件不存在建立新文件。
(2)c语言中读写字符所用函数fgetc(fp)从fp所指向的文件读入一个字符;fputc(ch,fp)把字符ch写到文件指针变量fp所指 向的文件中
(3)其次C语言读写字符串所用函数fets(str,n,fp)从fp指向的文件读入一个长度为n-1的字符串,存放到字符数组str中; fputs(str,fp)把str所指向的字符串写到文件指针变量fp所指向的文件中。
本题解决思路:先把文件student.in中的信息读出,然后用这些信息建立学生链表(StuLink)。链表创建完成后,完成要求 1:遍历链表找出每个学生的年龄,然后求平均年龄。完成要求二 :利用选择排序思想对学生姓名按字母表顺序进行链表 排序,然后输出排序好的姓名和学号。
一、已经存在的文件student.in信息
本文件我将它放在桌面具体路径为C:\Users\Mr.w\Desktop\student.in,以便在读入文件信息时快速找到此文件
二、读入文件信息并创建链表
部分代码:
typedef struct Student{
int num; //学号
char name[20]; //姓名
char sex[2]; //性别
int age; //年龄
struct Student *next;
}Student,*StuLink;
fp = fopen("C:\\Users\\Mr.w\\Desktop\\student.in", "r");//在指定位置读取信息
fgets(ch,4,fp); //读取信息
q = (StuLink)malloc(sizeof(Student)); //创建单个学生结点
fgets(q->name, 5, fp); //将读取到的学生姓名赋予当前学生结点的name域
三、求平均年龄
void ageAverage(StuLink s){
StuLink p=s->next;
int sum = 0, count = 0;
double aver;
while (p!=NULL)
{
sum += p->age;
count++;
p = p->next;
}
aver =(double) sum / count;
printf("平均分:%.2f\n", aver);
}
四、对学生姓名按字母表顺序排序
void nameSort(StuLink s){
StuLink minpre, min, p, pre,r;
r = s;
while (r->next != NULL){ //选择排序对链表按名字排序
pre = r;
p = pre->next;
min = p;
minpre = pre;
while (p != NULL)
{
if (strcmp(min->name,p->name) > 0){
minpre = pre;
min = p;
}
pre = p;
p = p->next;
}
if (r->next == min)
r = r->next;
else{
minpre->next = min->next; //防止断链
min->next = r->next; //尾插法
r->next = min;
r = min;
}
}
r = s->next;
while (r!=NULL)
{
printf("%s %d\n", r->name,r->num);
r = r->next;
}
}
运行结果:
对本问题有什么疑问欢迎讨论!!!