C语言写一个学籍管理系统,以链表的形式进行存储,要做到学生学号,姓名,性别,年龄信息的录入,实现数据的批量增加,根据学号数据信息的删除,根据学号数据信息的查找
时间: 2024-03-17 13:42:54 浏览: 53
好的,这是一个比较典型的链表应用题目。我可以为您提供一些思路:
首先,需要定义一个结构体来存储每个学生的信息,包括学号、姓名、性别、年龄等字段,例如:
```c
typedef struct Student {
int id; // 学号
char name[20]; // 姓名
char gender; // 性别
int age; // 年龄
struct Student *next; // 指向下一个节点的指针
} Student;
```
然后,可以定义一个指向链表头节点的指针,初始值为 NULL,表示链表为空:
```c
Student *head = NULL;
```
接下来,可以编写函数实现链表的各种操作。例如,录入一个学生信息的函数:
```c
void addStudent() {
Student *newStudent = (Student *)malloc(sizeof(Student)); // 创建一个新节点
printf("请输入学生信息:\n");
printf("学号:");
scanf("%d", &newStudent->id);
printf("姓名:");
scanf("%s", newStudent->name);
printf("性别:");
scanf(" %c", &newStudent->gender);
printf("年龄:");
scanf("%d", &newStudent->age);
newStudent->next = NULL; // 新节点的指针域初始化为 NULL
if (head == NULL) { // 如果链表为空,则将新节点作为头节点
head = newStudent;
} else { // 否则将新节点插入到链表末尾
Student *p = head;
while (p->next != NULL) {
p = p->next;
}
p->next = newStudent;
}
printf("添加成功!\n");
}
```
实现数据的批量增加可以在录入学生信息时使用循环语句,例如:
```c
void addStudents() {
int n;
printf("请输入要添加的学生数量:");
scanf("%d", &n);
for (int i = 0; i < n; i++) {
addStudent();
}
}
```
根据学号删除一个节点的函数可以如下实现:
```c
void deleteStudent(int id) {
if (head == NULL) { // 链表为空,无法删除
printf("链表为空,无法删除!\n");
return;
}
if (head->id == id) { // 如果要删除头节点
Student *p = head;
head = head->next;
free(p);
printf("删除成功!\n");
return;
}
Student *p = head;
while (p->next != NULL && p->next->id != id) { // 寻找要删除的节点
p = p->next;
}
if (p->next == NULL) { // 没有找到要删除的节点
printf("未找到要删除的节点!\n");
return;
}
Student *q = p->next; // 找到要删除的节点
p->next = q->next;
free(q);
printf("删除成功!\n");
}
```
根据学号查找一个节点的函数可以如下实现:
```c
void findStudent(int id) {
Student *p = head;
while (p != NULL && p->id != id) { // 寻找要查找的节点
p = p->next;
}
if (p == NULL) { // 没有找到要删除的节点
printf("未找到要查找的节点!\n");
return;
}
printf("学号:%d\n", p->id);
printf("姓名:%s\n", p->name);
printf("性别:%c\n", p->gender);
printf("年龄:%d\n", p->age);
}
```
除此之外,还需要编写其他辅助函数,例如打印链表、释放链表等。完整代码如下:
阅读全文