有10个学生,学生学籍库包括:学号、姓名、性别、出生年月、第二学期 大学英语和数据结构的成绩。选用合适的数据结构抽象学生学籍库,本次实训要 求使用链表结构,同时要求选用合适的存储方式,即把学籍库抽象成一个以学号 作为主关键字的动态查找表,并用链表表示和储存它,在自己构建的链表上实现 学生信息查询算法。编写程序,使之能提供以下功能。 1)系统菜单(即先输出提示信息序号1、2、3…,分别实现什么功能,输 入序号后,调用相应的功能函数)。 2)学生信息录入功能。 3)学生信息删除功能。 4)显示学生信息。 5)学生信息查找。 6)依据总分成绩对学生信息进行排序。
时间: 2024-03-19 13:45:41 浏览: 160
好的,根据你的要求,我可以提供以下解决方案:
首先,我们可以定义一个结构体来表示学生信息,包含学号、姓名、性别、出生年月、大学英语和数据结构的成绩:
```c
typedef struct student {
int id; // 学号
char name[20]; // 姓名
char gender; // 性别
char birth[10]; // 出生年月
double english_score; // 大学英语成绩
double data_structure_score; // 数据结构成绩
double total_score; // 总分
struct student *next; // 指向下一个结点的指针
} Student;
```
然后,我们可以定义一个链表结构,用于存储学生信息:
```c
typedef struct {
Student *head; // 头结点指针
int length; // 链表长度
} StudentList;
```
接下来,我们可以实现学生信息录入功能。这个功能可以通过向链表中添加一个新结点来实现:
```c
void add_student(StudentList *list, Student student) {
// 创建一个新结点
Student *new_node = (Student *)malloc(sizeof(Student));
*new_node = student;
new_node->next = NULL;
// 将新结点插入到链表末尾
if (list->head == NULL) {
list->head = new_node;
} else {
Student *p = list->head;
while (p->next != NULL) {
p = p->next;
}
p->next = new_node;
}
// 更新链表长度
list->length++;
}
```
学生信息删除功能可以通过遍历链表,找到对应学号的结点,并删除它来实现:
```c
void delete_student(StudentList *list, int id) {
// 找到要删除的结点
Student *p = list->head;
Student *prev = NULL;
while (p != NULL && p->id != id) {
prev = p;
p = p->next;
}
// 如果找到了要删除的结点,就删除它
if (p != NULL) {
if (prev == NULL) {
list->head = p->next;
} else {
prev->next = p->next;
}
free(p);
list->length--;
}
}
```
显示学生信息可以通过遍历链表,依次输出每个结点的信息来实现:
```c
void print_student(Student student) {
printf("id: %d\n", student.id);
printf("name: %s\n", student.name);
printf("gender: %c\n", student.gender);
printf("birth: %s\n", student.birth);
printf("english score: %.2lf\n", student.english_score);
printf("data structure score: %.2lf\n", student.data_structure_score);
printf("total score: %.2lf\n", student.total_score);
}
void show_students(StudentList list) {
Student *p = list.head;
while (p != NULL) {
print_student(*p);
printf("\n");
p = p->next;
}
}
```
学生信息查找可以通过遍历链表,找到对应学号的结点,并返回它来实现:
```c
Student *find_student(StudentList list, int id) {
Student *p = list.head;
while (p != NULL && p->id != id) {
p = p->next;
}
return p;
}
```
依据总分成绩对学生信息进行排序可以采用冒泡排序或快速排序等算法来实现。这里我们使用冒泡排序:
```c
void sort_students(StudentList *list) {
int i, j;
for (i = 0; i < list->length - 1; i++) {
for (j = 0; j < list->length - i - 1; j++) {
Student *p = list->head;
int k;
for (k = 0; k < j; k++) {
p = p->next;
}
Student *q = p->next;
if (p->total_score < q->total_score) {
// 交换相邻两个结点的位置
Student temp = *p;
*p = *q;
*q = temp;
}
}
}
}
```
最后,我们可以编写一个系统菜单函数,让用户选择要执行的功能:
```c
void menu(StudentList *list) {
int choice = 0;
while (choice != 6) {
printf("1. Add student\n");
printf("2. Delete student\n");
printf("3. Show students\n");
printf("4. Find student\n");
printf("5. Sort students\n");
printf("6. Quit\n");
printf("Enter your choice: ");
scanf("%d", &choice);
switch (choice) {
case 1:
// 学生信息录入功能
// 读入学生信息,调用 add_student 函数添加到链表中
break;
case 2:
// 学生信息删除功能
// 读入要删除的学生学号,调用 delete_student 函数删除对应结点
break;
case 3:
// 显示学生信息
// 调用 show_students 函数遍历链表,依次输出每个结点的信息
break;
case 4:
// 学生信息查找
// 读入要查找的学生学号,调用 find_student 函数查找对应结点,并输出该结点的信息
break;
case 5:
// 依据总分成绩对学生信息进行排序
// 调用 sort_students 函数对链表中的结点进行排序
break;
case 6:
// 退出程序
break;
default:
printf("Invalid choice\n");
break;
}
}
}
```
以上就是一个基本的学生信息管理系统的实现。当然,还可以根据需要进行优化和扩展。
阅读全文