C语言实现建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。
时间: 2023-12-04 08:14:29 浏览: 127
创建a、b两个链表,每个链表中的结点包含学号、成绩 将两个链表合并,按学号升序排列
好的,以下是 C 语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义学生结构体
struct student {
char id[11]; // 学号
char name[21]; // 姓名
char sex[3]; // 性别
int age; // 年龄
struct student *next; // 指向下一个结点的指针
};
// 创建链表
struct student *createList() {
struct student *head = NULL; // 头结点指针
struct student *tail = NULL; // 尾结点指针
char id[11], name[21], sex[3];
int age;
while (1) {
printf("请输入学生信息(学号 姓名 性别 年龄):");
scanf("%s %s %s %d", id, name, sex, &age);
if (age == 0) { // 年龄为0,表示输入结束
break;
}
struct student *node = (struct student *) malloc(sizeof(struct student)); // 创建新结点
strcpy(node->id, id);
strcpy(node->name, name);
strcpy(node->sex, sex);
node->age = age;
node->next = NULL;
if (head == NULL) { // 如果链表为空,则新结点为头结点
head = node;
tail = node;
} else { // 否则将新结点添加到链表尾部
tail->next = node;
tail = node;
}
}
return head;
}
// 删除年龄等于指定年龄的结点
struct student *deleteNode(struct student *head, int age) {
struct student *p = head; // 当前结点指针
struct student *pre = NULL; // 前一个结点指针
while (p != NULL) {
if (p->age == age) { // 年龄等于指定年龄
if (pre == NULL) { // 如果是头结点
head = p->next;
} else {
pre->next = p->next;
}
free(p); // 释放结点内存
p = (pre == NULL ? head : pre->next); // 继续向后遍历
} else {
pre = p;
p = p->next;
}
}
return head;
}
// 打印链表
void printList(struct student *head) {
printf("学号\t\t姓名\t\t性别\t年龄\n");
struct student *p = head;
while (p != NULL) {
printf("%s\t%s\t%s\t%d\n", p->id, p->name, p->sex, p->age);
p = p->next;
}
}
int main() {
struct student *head = createList(); // 创建链表
int age;
printf("请输入要删除的学生年龄:");
scanf("%d", &age);
head = deleteNode(head, age); // 删除年龄等于指定年龄的结点
printList(head); // 打印链表
return 0;
}
```
这段代码可以实现以下功能:
1. 创建一个包含学生信息的链表。
2. 输入一个年龄,删除链表中所有年龄等于这个年龄的结点。
3. 打印删除后的链表。
阅读全文