编程实现:分别采用结构体数组和链表存储学生信息(包括学号、姓名、各科成绩),按成 绩(总分)排序,按学号、姓名查找。
时间: 2023-12-23 07:04:29 浏览: 133
好的,以下是一个示例代码,分别采用结构体数组和链表存储学生信息,并按照总分排序,按照学号、姓名查找。代码注释中有详细的说明:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义学生结构体
struct student {
int id; // 学号
char name[20]; // 姓名
int score1; // 第一门课成绩
int score2; // 第二门课成绩
int score3; // 第三门课成绩
int total; // 总分
struct student *next; // 链表指针
};
// 定义学生结构体数组和链表头指针
struct student stu_arr[70];
struct student *stu_head = NULL;
// 定义链表节点插入函数
void insert_node(struct student *node) {
if (stu_head == NULL) {
// 如果链表为空,则直接插入节点
stu_head = node;
node->next = NULL;
} else {
// 如果链表非空,则按照总分降序插入节点
struct student *p = stu_head;
struct student *prev = NULL;
while (p != NULL && p->total >= node->total) {
prev = p;
p = p->next;
}
if (prev == NULL) {
// 如果插入的是链表头节点,则修改链表头指针
node->next = stu_head;
stu_head = node;
} else {
// 否则插入到prev和p之间
node->next = prev->next;
prev->next = node;
}
}
}
// 定义按学号查找函数
void search_by_id(int id) {
int i;
for (i = 0; i < 70; i++) {
if (stu_arr[i].id == id) {
printf("学号:%d,姓名:%s,三门课成绩:%d %d %d,总分:%d\n", stu_arr[i].id, stu_arr[i].name, stu_arr[i].score1, stu_arr[i].score2, stu_arr[i].score3, stu_arr[i].total);
return;
}
}
printf("未找到该学生!\n");
}
// 定义按姓名查找函数
void search_by_name(char *name) {
int i;
for (i = 0; i < 70; i++) {
if (strcmp(stu_arr[i].name, name) == 0) {
printf("学号:%d,姓名:%s,三门课成绩:%d %d %d,总分:%d\n", stu_arr[i].id, stu_arr[i].name, stu_arr[i].score1, stu_arr[i].score2, stu_arr[i].score3, stu_arr[i].total);
return;
}
}
printf("未找到该学生!\n");
}
// 定义打印学生信息函数
void print_student(struct student *p) {
printf("学号:%d,姓名:%s,三门课成绩:%d %d %d,总分:%d\n", p->id, p->name, p->score1, p->score2, p->score3, p->total);
}
// 定义打印所有学生信息函数
void print_all_students() {
struct student *p = stu_head;
while (p != NULL) {
print_student(p);
p = p->next;
}
}
// 主函数
int main() {
int i;
// 读入学生信息到结构体数组中
for (i = 0; i < 70; i++) {
printf("请输入第%d个学生的学号、姓名、三门课成绩:", i+1);
scanf("%d %s %d %d %d", &stu_arr[i].id, stu_arr[i].name, &stu_arr[i].score1, &stu_arr[i].score2, &stu_arr[i].score3);
stu_arr[i].total = stu_arr[i].score1 + stu_arr[i].score2 + stu_arr[i].score3;
// 将当前学生的信息插入到链表中
struct student *node = (struct student*)malloc(sizeof(struct student));
node->id = stu_arr[i].id;
strcpy(node->name, stu_arr[i].name);
node->score1 = stu_arr[i].score1;
node->score2 = stu_arr[i].score2;
node->score3 = stu_arr[i].score3;
node->total = stu_arr[i].total;
insert_node(node);
}
// 输出按总分降序排序后的学生信息
printf("按总分降序排序后的学生信息:\n");
print_all_students();
// 按学号查找
int id;
printf("请输入要查找的学生学号:");
scanf("%d", &id);
search_by_id(id);
// 按姓名查找
char name[20];
printf("请输入要查找的学生姓名:");
scanf("%s", name);
search_by_name(name);
return 0;
}
```
需要注意的是,链表中的节点需要动态申请内存,使用完毕后需要手动释放。
阅读全文