)建立一个链表,每个节点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的节点所包含的年龄等于此年龄,则将此节点删去。 用c语言
时间: 2024-03-14 17:47:06 浏览: 62
好的,下面是一个简单的 C 语言代码实现。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义链表节点结构体
struct Student {
int num;
char name[20];
char sex;
int age;
struct Student *next;
};
// 创建链表函数
struct Student *createList() {
int n;
printf("请输入链表节点个数: ");
scanf("%d", &n);
struct Student *head = (struct Student *)malloc(sizeof(struct Student)); // 创建头节点
struct Student *p = head; // 定义指向链表结点的指针p
for (int i = 0; i < n; i++) {
struct Student *node = (struct Student *)malloc(sizeof(struct Student)); // 创建新结点
printf("请输入第%d个节点的信息: \n", i+1);
printf("学号: ");
scanf("%d", &node->num);
printf("姓名: ");
scanf("%s", node->name);
printf("性别: ");
scanf(" %c", &node->sex);
printf("年龄: ");
scanf("%d", &node->age);
node->next = NULL; // 新结点的next初始化为NULL
p->next = node; // 将新结点添加到链表尾部
p = node; // 更新p指针,指向链表的最后一个结点
}
return head; // 返回头节点指针
}
// 删除年龄等于指定值的节点
void deleteNode(struct Student *head, int age) {
struct Student *p = head->next; // 定义指向链表结点的指针p,从第一个结点开始遍历
struct Student *pre = head; // 定义指向链表结点的指针pre,指向p的前一个结点
while (p != NULL) {
if (p->age == age) {
pre->next = p->next; // 将前一个结点的next指向p的下一个结点
free(p); // 释放p指向的结点
p = pre->next; // 更新p指针,继续遍历链表
} else {
pre = p; // 更新pre指针
p = p->next; // 更新p指针
}
}
}
// 输出链表函数
void printList(struct Student *head) {
struct Student *p = head->next; // 定义指向链表结点的指针p,从第一个结点开始遍历
while (p != NULL) {
printf("学号: %d ", p->num);
printf("姓名: %s ", p->name);
printf("性别: %c ", p->sex);
printf("年龄: %d ", p->age);
printf("\n");
p = p->next; // 更新p指针,继续遍历链表
}
}
int main() {
struct Student *head = createList();
printf("删除年龄为: ");
int age;
scanf("%d", &age);
deleteNode(head, age);
printf("删除后的链表为: \n");
printList(head);
return 0;
}
```
以上代码中,`createList()` 函数用于创建链表,`deleteNode()` 函数用于删除年龄等于指定值的节点,`printList()` 函数用于输出链表。在 `main()` 函数中,我们首先调用 `createList()` 函数创建链表,然后输入要删除的年龄,调用 `deleteNode()` 函数删除年龄等于指定值的节点,最后调用 `printList()` 函数输出链表。
阅读全文