c语言将文件中用动态链表储存的学生信息按平均分排序
时间: 2024-01-22 08:04:12 浏览: 59
好的,我可以为您提供一个用动态链表储存学生信息,并按照平均分排序的 C 语言程序。首先,我们可以定义一个学生信息结构体,例如:
```
typedef struct student
{
char name[20];
int age;
char gender[10];
char major[30];
float score;
struct student *next;
} Student;
```
其中,name、age、gender、major 分别表示学生的姓名、年龄、性别和专业,score 表示学生的平均分,next 表示指向下一个节点的指针。
接着,我们可以编写一个函数,用于向链表中添加新的学生信息。该函数可以按照学生的姓名的字典序顺序来插入节点,以方便后续的查找和排序。同时,我们可以在插入节点时,计算并更新学生的平均分。例如:
```
void insertStudent(Student **head, char name[], int age, char gender[], char major[], float score)
{
Student *newStudent = (Student *)malloc(sizeof(Student)); // 动态分配内存
strcpy(newStudent->name, name);
newStudent->age = age;
strcpy(newStudent->gender, gender);
strcpy(newStudent->major, major);
newStudent->score = score;
newStudent->next = NULL;
if (*head == NULL) // 如果链表为空,则将新节点作为头节点
{
*head = newStudent;
}
else if (strcmp(name, (*head)->name) < 0) // 如果新节点的姓名小于头节点的姓名,则将新节点作为头节点
{
newStudent->next = *head;
*head = newStudent;
}
else // 否则,按照姓名的字典序顺序插入节点
{
Student *p = *head;
while (p->next != NULL && strcmp(name, p->next->name) >= 0)
{
p = p->next;
}
newStudent->next = p->next;
p->next = newStudent;
}
// 计算并更新学生的平均分
float sum = 0.0;
int count = 0;
Student *p = *head;
while (p != NULL)
{
sum += p->score;
count++;
p = p->next;
}
float avg = sum / count;
p = *head;
while (p != NULL)
{
p->score -= avg;
p = p->next;
}
}
```
最后,我们可以编写一个函数,用于遍历链表,并输出每个节点的学生信息。同时,我们可以按照学生的平均分排序,以方便后续的查找和统计。例如:
```
void printStudent(Student *head)
{
// 计算学生的平均分
float sum = 0.0;
int count = 0;
Student *p = head;
while (p != NULL)
{
sum += p->score;
count++;
p = p->next;
}
float avg = sum / count;
// 将学生信息按照平均分排序
p = head;
Student *prev = NULL;
while (p != NULL)
{
Student *q = p->next;
float maxScore = p->score;
Student *maxStudent = p;
while (q != NULL)
{
if (q->score > maxScore)
{
maxScore = q->score;
maxStudent = q;
}
q = q->next;
}
if (maxStudent != p)
{
if (prev != NULL)
{
prev->next = maxStudent;
}
else
{
head = maxStudent;
}
Student *tmp = maxStudent->next;
maxStudent->next = p->next;
p->next = tmp;
prev = maxStudent;
}
else
{
prev = p;
p = p->next;
}
}
// 输出学生信息
p = head;
while (p != NULL)
{
printf("Name: %s\n", p->name);
printf("Age: %d\n", p->age);
printf("Gender: %s\n", p->gender);
printf("Major: %s\n", p->major);
printf("Score: %.2f\n", p->score + avg);
printf("\n");
p = p->next;
}
}
```
这样,我们就可以使用动态链表来储存学生信息,并按照平均分排序了。
阅读全文