c语言学生管理系统链表
时间: 2023-09-29 13:08:31 浏览: 46
下面是一个简单的C语言学生管理系统链表实现的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 学生结构体
typedef struct Student {
char name[20]; // 名字
int age; // 年龄
float score; // 分数
struct Student *next; // 指向下一个学生的指针
} student;
// 添加学生
void add_student(student **head) {
student *new_student = (student*)malloc(sizeof(student)); // 创建新学生节点
printf("请输入学生姓名:");
scanf("%s", new_student->name);
printf("请输入学生年龄:");
scanf("%d", &new_student->age);
printf("请输入学生成绩:");
scanf("%f", &new_student->score);
new_student->next = NULL;
if (*head == NULL) {
*head = new_student;
} else {
student *temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = new_student;
}
printf("添加成功!\n");
}
// 删除学生
void delete_student(student **head) {
if (*head == NULL) {
printf("链表为空,无法删除!\n");
return;
}
char name[20];
printf("请输入要删除的学生姓名:");
scanf("%s", name);
if (strcmp((*head)->name, name) == 0) {
student *temp = *head;
*head = (*head)->next;
free(temp);
printf("删除成功!\n");
return;
}
student *temp = *head;
while (temp->next != NULL) {
if (strcmp(temp->next->name, name) == 0) {
student *del_student = temp->next;
temp->next = del_student->next;
free(del_student);
printf("删除成功!\n");
return;
}
temp = temp->next;
}
printf("未找到该学生,删除失败!\n");
}
// 修改学生信息
void modify_student(student **head) {
if (*head == NULL) {
printf("链表为空,无法修改!\n");
return;
}
char name[20];
printf("请输入要修改的学生姓名:");
scanf("%s", name);
student *temp = *head;
while (temp != NULL) {
if (strcmp(temp->name, name) == 0) {
printf("请输入修改后的学生姓名:");
scanf("%s", temp->name);
printf("请输入修改后的学生年龄:");
scanf("%d", &temp->age);
printf("请输入修改后的学生成绩:");
scanf("%f", &temp->score);
printf("修改成功!\n");
return;
}
temp = temp->next;
}
printf("未找到该学生,修改失败!\n");
}
// 查找学生
void search_student(student *head) {
if (head == NULL) {
printf("链表为空,无法查找!\n");
return;
}
char name[20];
printf("请输入要查找的学生姓名:");
scanf("%s", name);
student *temp = head;
while (temp != NULL) {
if (strcmp(temp->name, name) == 0) {
printf("姓名:%s,年龄:%d,成绩:%.2f\n", temp->name, temp->age, temp->score);
return;
}
temp = temp->next;
}
printf("未找到该学生!\n");
}
// 显示所有学生
void show_all_students(student *head) {
if (head == NULL) {
printf("链表为空,无法显示!\n");
return;
}
printf("姓名\t年龄\t成绩\n");
student *temp = head;
while (temp != NULL) {
printf("%s\t%d\t%.2f\n", temp->name, temp->age, temp->score);
temp = temp->next;
}
}
// 释放链表空间
void free_list(student **head) {
student *temp = *head;
while (temp != NULL) {
*head = (*head)->next;
free(temp);
temp = *head;
}
}
int main() {
student *head = NULL; // 头节点指针初始化为NULL
int choice;
while (1) {
printf("\n********** 学生管理系统 **********\n");
printf("1. 添加学生\n");
printf("2. 删除学生\n");
printf("3. 修改学生信息\n");
printf("4. 查找学生\n");
printf("5. 显示所有学生\n");
printf("6. 退出\n");
printf("请输入你的选择:");
scanf("%d", &choice);
switch (choice) {
case 1: add_student(&head); break;
case 2: delete_student(&head); break;
case 3: modify_student(&head); break;
case 4: search_student(head); break;
case 5: show_all_students(head); break;
case 6: free_list(&head); return 0;
default: printf("输入错误,请重新选择!\n");
}
}
return 0;
}
```
这个示例中,我们定义了一个`student`结构体,包含了学生的姓名、年龄、分数以及指向下一个学生节点的指针。然后,我们实现了添加学生、删除学生、修改学生信息、查找学生、显示所有学生以及释放链表空间等操作。在`main`函数中,我们使用一个无限循环不断显示菜单,根据用户的选择调用相应的函数。注意,在添加、删除和修改学生信息时,我们需要传入头节点的指针的指针,这是因为在这些操作中可能会改变头节点的指针。