建立一个链表,每个节点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的节点所包含的年龄等于此年龄,则将此节点删去。
时间: 2024-03-18 13:42:13 浏览: 61
好的,我可以帮你编写这个链表的程序。以下是代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 20
struct student {
int id;
char name[MAX_NAME_LEN];
char sex;
int age;
struct student *next;
};
struct student *create_student(int id, char *name, char sex, int age) {
struct student *s = (struct student *)malloc(sizeof(struct student));
if (s == NULL) {
printf("创建学生失败,内存分配失败!\n");
return NULL;
}
s->id = id;
strcpy(s->name, name);
s->sex = sex;
s->age = age;
s->next = NULL;
return s;
}
void add_student(struct student **head, struct student *s) {
if (*head == NULL) {
*head = s;
} else {
struct student *p = *head;
while (p->next != NULL) {
p = p->next;
}
p->next = s;
}
}
void print_student(struct student *s) {
printf("%d\t%s\t%c\t%d\n", s->id, s->name, s->sex, s->age);
}
void print_all_students(struct student *head) {
printf("学号\t姓名\t性别\t年龄\n");
struct student *p = head;
while (p != NULL) {
print_student(p);
p = p->next;
}
}
void delete_students_by_age(struct student **head, int age) {
// 删除链表头节点
while (*head != NULL && (*head)->age == age) {
struct student *p = *head;
*head = (*head)->next;
free(p);
}
// 删除链表中间节点
if (*head != NULL) {
struct student *prev = *head;
struct student *curr = (*head)->next;
while (curr != NULL) {
if (curr->age == age) {
prev->next = curr->next;
free(curr);
curr = prev->next;
} else {
prev = curr;
curr = curr->next;
}
}
}
}
int main() {
struct student *head = NULL;
// 添加几个测试学生
add_student(&head, create_student(1001, "张三", 'M', 20));
add_student(&head, create_student(1002, "李四", 'F', 21));
add_student(&head, create_student(1003, "王五", 'M', 22));
add_student(&head, create_student(1004, "赵六", 'F', 20));
add_student(&head, create_student(1005, "钱七", 'M', 21));
// 输出所有学生
printf("原始学生信息:\n");
print_all_students(head);
// 删除年龄为20的学生
int age = 20;
delete_students_by_age(&head, age);
// 输出删除后的学生
printf("删除年龄为%d的学生后:\n", age);
print_all_students(head);
return 0;
}
```
程序的运行流程如下:
1. 定义一个 `student` 结构体,包括学号、姓名、性别、年龄和 `next` 指针,用于构建链表。
2. 定义 `create_student` 函数,用于创建一个新的学生节点。
3. 定义 `add_student` 函数,用于将一个学生节点添加到链表中。
4. 定义 `print_student` 函数,用于输出一个学生节点的信息。
5. 定义 `print_all_students` 函数,用于输出链表中所有学生的信息。
6. 定义 `delete_students_by_age` 函数,用于删除链表中年龄等于指定年龄的学生节点。
7. 在 `main` 函数中,创建几个学生节点并添加到链表中。
8. 输出原始的学生信息。
9. 调用 `delete_students_by_age` 函数删除年龄为指定年龄的学生节点。
10. 输出删除后的学生信息。
注意,这个程序只是演示了如何创建、添加、删除和输出链表中的节点,并没有进行输入。如果需要从文件中读取学生信息,可以使用文件操作函数。
阅读全文