2.建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。要求运行界面如下所示(具体测试用例请考虑周全):
时间: 2024-04-04 12:32:43 浏览: 12
好的,这是一个关于链表的问题,需要建立一个链表,每个结点包括学号、姓名、性别、年龄。同时需要输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删除。下面是一个示例的运行界面:
请输入学生信息,输入-1结束输入:
学号:1001
姓名:张三
性别:男
年龄:20
学号:1002
姓名:李四
性别:女
年龄:19
学号:1003
姓名:王五
性别:男
年龄:20
学号:-1
请输入待删除的年龄:
20
删除成功!删除后的链表为:
学号:1002
姓名:李四
性别:女
年龄:19
请问是否还需要继续删除?(Y/N):Y
请输入待删除的年龄:
19
删除成功!删除后的链表为:
暂无学生信息。
请问是否还需要继续删除?(Y/N):N
程序结束。
相关问题
2.建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。代码
以下是基于C语言的链表实现,实现了链表的插入、遍历和根据年龄删除结点的功能。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义链表结构体
struct student {
int id;
char name[20];
char gender;
int age;
struct student *next;
};
// 插入结点
struct student *insert(struct student *head, int id, char *name, char gender, int age) {
struct student *p = (struct student *)malloc(sizeof(struct student));
p->id = id;
strcpy(p->name, name);
p->gender = gender;
p->age = age;
p->next = head;
head = p;
return head;
}
// 遍历链表
void traverse(struct student *head) {
struct student *p = head;
while (p != NULL) {
printf("id: %d, name: %s, gender: %c, age: %d\n", p->id, p->name, p->gender, p->age);
p = p->next;
}
}
// 根据年龄删除结点
struct student *delete_by_age(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;
}
int main() {
struct student *head = NULL;
head = insert(head, 1, "Alice", 'F', 18);
head = insert(head, 2, "Bob", 'M', 18);
head = insert(head, 3, "Charlie", 'M', 20);
head = insert(head, 4, "David", 'M', 19);
printf("Before delete:\n");
traverse(head);
head = delete_by_age(head, 18);
printf("After delete:\n");
traverse(head);
return 0;
}
```
代码中定义了一个 `student` 结构体,包含学号、姓名、性别和年龄四个成员变量,以及一个指向下一个结点的指针。通过 `insert` 函数实现链表结点的插入,通过 `traverse` 函数实现链表的遍历,通过 `delete_by_age` 函数实现根据年龄删除结点的功能。在主函数中,首先插入了四个结点,然后遍历了链表,接着根据年龄删除了年龄为 18 的结点,最后再次遍历链表,验证了删除操作的正确性。
建立一个链表,每个结点包括:学号,姓名,性别,年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删除
首先,我们需要定义一个结构体来表示链表中的每个节点,包括学号、姓名、性别和年龄:
```
struct Node {
int id; // 学号
string name; // 姓名
char gender; // 性别
int age; // 年龄
Node* next; // 指向下一个节点的指针
};
```
然后,我们可以定义一个函数来创建链表,并在其中插入节点:
```
Node* createList() {
Node* head = new Node(); // 创建头节点
head->next = NULL; // 头节点的指针为空
int n; // 输入节点个数
cin >> n;
Node* p = head; // 指向当前节点的指针
for (int i = ; i < n; i++) {
Node* node = new Node(); // 创建新节点
cin >> node->id >> node->name >> node->gender >> node->age;
node->next = NULL; // 新节点的指针为空
p->next = node; // 将新节点插入到链表中
p = node; // 将指针指向新节点
}
return head; // 返回头节点
}
```
接下来,我们可以定义一个函数来删除链表中年龄等于给定年龄的节点:
```
void deleteNode(Node* head, int age) {
Node* p = head->next; // 指向第一个节点的指针
Node* pre = head; // 指向前一个节点的指针
while (p != NULL) {
if (p->age == age) { // 如果节点的年龄等于给定年龄
pre->next = p->next; // 将前一个节点的指针指向下一个节点
delete p; // 删除当前节点
p = pre->next; // 将指针指向下一个节点
} else {
pre = p; // 将前一个节点的指针指向当前节点
p = p->next; // 将指针指向下一个节点
}
}
}
```
最后,我们可以在主函数中调用以上两个函数来创建链表并删除节点:
```
int main() {
Node* head = createList(); // 创建链表
int age;
cin >> age;
deleteNode(head, age); // 删除节点
Node* p = head->next; // 指向第一个节点的指针
while (p != NULL) { // 遍历链表并输出每个节点的信息
cout << p->id << " " << p->name << " " << p->gender << " " << p->age << endl;
p = p->next;
}
return ;
}
```