C语言如何用链表实现学生信息管理系统中的删除学生信息
时间: 2024-02-25 20:57:16 浏览: 95
使用链表实现学生信息管理系统中的删除学生信息相对于使用数组有一定的优势,因为链表可以随时动态地插入和删除节点,不需要考虑数组大小的问题。下面是一份使用链表实现学生信息管理系统的代码示例,其中包括了删除学生信息的实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student {
char id[20];
char name[20];
char sex[5];
int age;
struct student *next;
};
struct student *head = NULL;
void add_student();
void search_student();
void modify_student();
void delete_student();
void print_student();
int main() {
int choice;
while (1) {
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();
break;
case 2:
search_student();
break;
case 3:
modify_student();
break;
case 4:
delete_student();
break;
case 5:
print_student();
break;
case 6:
exit(0);
default:
printf("选择错误!\n");
}
}
return 0;
}
void add_student() {
struct student *p, *s;
s = (struct student *)malloc(sizeof(struct student));
printf("请输入学生的学号:");
scanf("%s", s->id);
printf("请输入学生的姓名:");
scanf("%s", s->name);
printf("请输入学生的性别:");
scanf("%s", s->sex);
printf("请输入学生的年龄:");
scanf("%d", &s->age);
s->next = NULL;
if (head == NULL) {
head = s;
} else {
p = head;
while (p->next != NULL) {
p = p->next;
}
p->next = s;
}
printf("添加成功!\n");
}
void search_student() {
struct student *p;
char id[20], name[20];
int flag = 0;
printf("请输入要查询的学生学号或姓名:");
scanf("%s", id);
p = head;
while (p != NULL) {
if (strcmp(p->id, id) == 0 || strcmp(p->name, id) == 0) {
printf("学号:%s 姓名:%s 性别:%s 年龄:%d\n", p->id, p->name, p->sex, p->age);
flag = 1;
}
p = p->next;
}
if (flag == 0) {
printf("未找到该学生信息!\n");
}
}
void modify_student() {
struct student *p;
char id[20], name[20];
int flag = 0;
printf("请输入要修改的学生学号或姓名:");
scanf("%s", id);
p = head;
while (p != NULL) {
if (strcmp(p->id, id) == 0 || strcmp(p->name, id) == 0) {
printf("请输入学生的新姓名:");
scanf("%s", p->name);
printf("请输入学生的新性别:");
scanf("%s", p->sex);
printf("请输入学生的新年龄:");
scanf("%d", &p->age);
flag = 1;
}
p = p->next;
}
if (flag == 0) {
printf("未找到该学生信息!\n");
} else {
printf("修改成功!\n");
}
}
void delete_student() {
struct student *p, *q;
char id[20], name[20];
int flag = 0;
printf("请输入要删除的学生学号或姓名:");
scanf("%s", id);
p = head;
while (p != NULL) {
if (strcmp(p->id, id) == 0 || strcmp(p->name, id) == 0) {
if (p == head) {
head = p->next;
} else {
q->next = p->next;
}
free(p);
flag = 1;
printf("删除成功!\n");
break;
}
q = p;
p = p->next;
}
if (flag == 0) {
printf("未找到该学生信息!\n");
}
}
void print_student() {
struct student *p;
p = head;
while (p != NULL) {
printf("学号:%s 姓名:%s 性别:%s 年龄:%d\n", p->id, p->name, p->sex, p->age);
p = p->next;
}
}
```
在上述代码中,使用了一个链表来保存学生信息,删除学生信息的实现函数是 delete_student()。在该函数中,首先输入要删除的学生学号或姓名,然后遍历链表查找该学生信息,如果找到了就将其从链表中删除,并释放内存。需要注意的是,在删除链表节点之前,需要先保存该节点的前一个节点,以便将其与后面的节点连接起来。
阅读全文