n名学生的成绩已在主函数中放入一个带头节点的链接结构中,h指向链表的头节点。请编写函数对成绩进行排序,并求出平均分。同时将结果写入文件
时间: 2023-04-30 20:00:40 浏览: 97
C语言程序设计-有一个一维数组score,内放10个学生的成绩,用一个函数来求平均成绩;
5星 · 资源好评率100%
首先,我们需要定义一个结构体来存储学生的成绩信息:
```
typedef struct student {
char name[20]; // 学生姓名
int score; // 学生成绩
struct student *next; // 指向下一个学生的指针
} Student;
```
然后,我们可以编写一个函数来对链表中的成绩进行排序。这里我们选择使用冒泡排序算法:
```
void sort(Student *h) {
int swapped;
Student *ptr1;
Student *lptr = NULL;
/* 如果链表为空,则直接返回 */
if (h == NULL)
return;
do {
swapped = ;
ptr1 = h;
while (ptr1->next != lptr) {
if (ptr1->score < ptr1->next->score) {
/* 交换两个节点的数据 */
char temp_name[20];
int temp_score;
strcpy(temp_name, ptr1->name);
temp_score = ptr1->score;
strcpy(ptr1->name, ptr1->next->name);
ptr1->score = ptr1->next->score;
strcpy(ptr1->next->name, temp_name);
ptr1->next->score = temp_score;
swapped = 1;
}
ptr1 = ptr1->next;
}
lptr = ptr1;
} while (swapped);
}
```
最后,我们可以编写一个函数来计算平均分,并将结果写入文件:
```
void calculate_average(Student *h) {
int sum = ;
int count = ;
Student *ptr = h->next;
FILE *fp = fopen("result.txt", "w");
/* 遍历链表,计算总分数和学生人数 */
while (ptr != NULL) {
sum += ptr->score;
count++;
ptr = ptr->next;
}
/* 计算平均分 */
float average = (float)sum / count;
/* 将结果写入文件 */
fprintf(fp, "平均分:%.2f\n", average);
fprintf(fp, "排名\t姓名\t成绩\n");
ptr = h->next;
int rank = 1;
while (ptr != NULL) {
fprintf(fp, "%d\t%s\t%d\n", rank, ptr->name, ptr->score);
ptr = ptr->next;
rank++;
}
fclose(fp);
}
```
完整代码如下:
```
#include <stdio.h>
#include <string.h>
typedef struct student {
char name[20]; // 学生姓名
int score; // 学生成绩
struct student *next; // 指向下一个学生的指针
} Student;
void sort(Student *h) {
int swapped;
Student *ptr1;
Student *lptr = NULL;
/* 如果链表为空,则直接返回 */
if (h == NULL)
return;
do {
swapped = ;
ptr1 = h;
while (ptr1->next != lptr) {
if (ptr1->score < ptr1->next->score) {
/* 交换两个节点的数据 */
char temp_name[20];
int temp_score;
strcpy(temp_name, ptr1->name);
temp_score = ptr1->score;
strcpy(ptr1->name, ptr1->next->name);
ptr1->score = ptr1->next->score;
strcpy(ptr1->next->name, temp_name);
ptr1->next->score = temp_score;
swapped = 1;
}
ptr1 = ptr1->next;
}
lptr = ptr1;
} while (swapped);
}
void calculate_average(Student *h) {
int sum = ;
int count = ;
Student *ptr = h->next;
FILE *fp = fopen("result.txt", "w");
/* 遍历链表,计算总分数和学生人数 */
while (ptr != NULL) {
sum += ptr->score;
count++;
ptr = ptr->next;
}
/* 计算平均分 */
float average = (float)sum / count;
/* 将结果写入文件 */
fprintf(fp, "平均分:%.2f\n", average);
fprintf(fp, "排名\t姓名\t成绩\n");
ptr = h->next;
int rank = 1;
while (ptr != NULL) {
fprintf(fp, "%d\t%s\t%d\n", rank, ptr->name, ptr->score);
ptr = ptr->next;
rank++;
}
fclose(fp);
}
int main() {
/* 创建链表头节点 */
Student *h = (Student *)malloc(sizeof(Student));
h->next = NULL;
/* 读取学生信息并插入链表 */
int n;
printf("请输入学生人数:");
scanf("%d", &n);
for (int i = ; i < n; i++) {
Student *s = (Student *)malloc(sizeof(Student));
printf("请输入第%d个学生的姓名和成绩:", i + 1);
scanf("%s%d", s->name, &s->score);
s->next = h->next;
h->next = s;
}
/* 对成绩进行排序 */
sort(h);
/* 计算平均分并将结果写入文件 */
calculate_average(h);
/* 释放链表内存 */
Student *ptr = h->next;
while (ptr != NULL) {
Student *temp = ptr;
ptr = ptr->next;
free(temp);
}
free(h);
return ;
}
```
阅读全文