用链表实现学生成绩管理
时间: 2023-07-12 16:08:46 浏览: 51
好的,我们可以定义一个结构体来表示学生信息和成绩,然后使用链表来管理这些数据。
首先,我们定义结构体 `Student`:
```c
typedef struct student {
char name[20];
int id;
float score;
struct student *next;
} Student;
```
其中,`name` 表示学生姓名,`id` 表示学生学号,`score` 表示学生成绩,`next` 表示指向下一个节点的指针。
然后,我们需要实现以下操作:
1. 添加一个学生节点
2. 删除一个学生节点
3. 修改一个学生节点的信息
4. 查找一个学生节点的信息
5. 输出所有学生的信息
接下来,我们逐个实现这些操作。
1. 添加一个学生节点
```c
Student *addStudent(Student *head) {
Student *p = (Student *)malloc(sizeof(Student));
printf("Enter student name, id, score:\n");
scanf("%s %d %f", p->name, &p->id, &p->score);
p->next = head;
head = p;
return head;
}
```
这里使用了 `malloc` 动态分配内存来创建新节点,然后在键盘输入学生信息,并将节点插入链表头部。
2. 删除一个学生节点
```c
Student *deleteStudent(Student *head, int id) {
Student *p = head;
Student *pre = NULL;
while (p != NULL && p->id != id) {
pre = p;
p = p->next;
}
if (p == NULL) {
printf("No such student.\n");
return head;
}
if (pre == NULL) {
head = head->next;
} else {
pre->next = p->next;
}
free(p);
return head;
}
```
这里使用了指针变量 `pre` 来记录当前节点的前一个节点,以便在删除节点时修改链表指针。
3. 修改一个学生节点的信息
```c
void modifyStudent(Student *head, int id) {
Student *p = head;
while (p != NULL && p->id != id) {
p = p->next;
}
if (p == NULL) {
printf("No such student.\n");
return;
}
printf("Enter new name, id, score:\n");
scanf("%s %d %f", p->name, &p->id, &p->score);
}
```
直接使用指针变量 `p` 在链表中查找到需要修改的节点,然后键盘输入修改后的学生信息。
4. 查找一个学生节点的信息
```c
void findStudent(Student *head, int id) {
Student *p = head;
while (p != NULL && p->id != id) {
p = p->next;
}
if (p == NULL) {
printf("No such student.\n");
return;
}
printf("Name: %s\n", p->name);
printf("ID: %d\n", p->id);
printf("Score: %f\n", p->score);
}
```
同样是使用指针变量 `p` 在链表中查找到需要查询的节点,并输出学生信息。
5. 输出所有学生的信息
```c
void printAll(Student *head) {
Student *p = head;
while (p != NULL) {
printf("Name: %s\n", p->name);
printf("ID: %d\n", p->id);
printf("Score: %f\n", p->score);
p = p->next;
}
}
```
顺序遍历整个链表,并输出每个节点的学生信息。
最后,我们可以在 `main` 函数中调用这些操作来实现完整的学生成绩管理系统。
```c
int main() {
Student *head = NULL;
int choice = 0;
int id = 0;
while (1) {
printf("1. Add student\n");
printf("2. Delete student\n");
printf("3. Modify student\n");
printf("4. Find student\n");
printf("5. Print all students\n");
printf("0. Exit\n");
scanf("%d", &choice);
switch (choice) {
case 1:
head = addStudent(head);
break;
case 2:
printf("Enter student id:\n");
scanf("%d", &id);
head = deleteStudent(head, id);
break;
case 3:
printf("Enter student id:\n");
scanf("%d", &id);
modifyStudent(head, id);
break;
case 4:
printf("Enter student id:\n");
scanf("%d", &id);
findStudent(head, id);
break;
case 5:
printAll(head);
break;
case 0:
return 0;
default:
printf("Invalid choice.\n");
}
}
}
```