使用C语言实现:建立一个链表,每个节点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的节点所包含的年龄等于此年龄,则将此节点删去。
时间: 2024-03-14 13:47:31 浏览: 65
好的,我来给你讲一下这道题该怎么做。
首先,我们需要定义链表节点的结构体,包括学号、姓名、性别、年龄和一个指向下一个节点的指针,如下所示:
```c
typedef struct node {
int id; // 学号
char name[20]; // 姓名
char gender; // 性别
int age; // 年龄
struct node* next; // 指向下一个节点的指针
} Node;
```
接下来,我们需要实现创建链表和删除节点的函数。
创建链表函数可以按照以下步骤进行:
1. 定义一个头节点,并将其指针赋值为 NULL。
2. 循环读入学生信息,每读入一个信息就创建一个节点,并将其插入到链表的末尾。
3. 返回头节点的指针。
具体实现如下:
```c
Node* createList() {
Node* head = NULL;
Node* tail = NULL;
Node* newNode;
int id, age;
char name[20], gender;
// 循环读入学生信息,直到输入 -1 为止
while (1) {
printf("请输入学号、姓名、性别、年龄(以空格分隔,输入 -1 结束):");
scanf("%d", &id);
if (id == -1) {
break;
}
scanf("%s %c %d", name, &gender, &age);
// 创建新节点
newNode = (Node*) malloc(sizeof(Node));
newNode->id = id;
strcpy(newNode->name, name);
newNode->gender = gender;
newNode->age = age;
newNode->next = NULL;
// 将新节点插入到链表末尾
if (head == NULL) {
head = newNode;
tail = newNode;
} else {
tail->next = newNode;
tail = newNode;
}
}
return head;
}
```
接下来是删除节点的函数,具体实现如下:
```c
void deleteNode(Node* head, int age) {
Node* prev = head;
Node* 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;
}
}
}
```
这个函数的作用是删除链表中所有年龄等于给定年龄的节点。首先定义两个指针 prev 和 curr,分别指向头节点和头节点的下一个节点。然后循环遍历链表,如果遇到一个年龄等于给定年龄的节点,则删除该节点;否则继续遍历下一个节点。需要注意的是,在删除节点时需要释放该节点的内存空间。
最后,我们来写一个主函数,调用上述两个函数即可:
```c
int main() {
Node* head = createList();
int age;
printf("请输入要删除的年龄:");
scanf("%d", &age);
deleteNode(head, age);
// 打印剩余节点的信息
printf("剩余节点的信息:\n");
Node* curr = head;
while (curr != NULL) {
printf("%d %s %c %d\n", curr->id, curr->name, curr->gender, curr->age);
curr = curr->next;
}
return 0;
}
```
这样,我们就完成了这道题的实现。
阅读全文