建立一个链表,每个结点包括:学号,姓名,性别,年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。
时间: 2023-05-31 22:21:06 浏览: 126
### 回答1:
首先,我们需要定义一个结构体来表示链表中的每个节点,包括学号、姓名、性别和年龄:
```
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 ;
}
```
### 回答2:
### 回答3:
链表是一种常用的数据结构,由一个个结点组成。每个结点包含两个部分:数据部分和指针部分。数据部分可以是一个或多个数据,指针部分指向下一个结点。
要建立一个包含学号、姓名、性别、年龄的链表,可以先定义一个结构体,如下所示:
```c
struct student {
int id;
char name[20];
char gender[5];
int age;
struct student *next;
};
```
其中,id、name、gender、age是结点的数据部分,next是指向下一个结点的指针部分。
接下来,可以编写一个函数,用来输入年龄和创建链表。函数可以先输入年龄,然后根据需要创建多个结点,并将它们连接起来。
```c
struct student *createList(int age) {
struct student *head = NULL;
struct student *tail = NULL;
int id = 1;
while (1) {
struct student *node = (struct student*)malloc(sizeof(struct student));
printf("请输入第%d个学生的姓名、性别、年龄(用空格分隔):", id);
scanf("%s %s %d", node->name, node->gender, &node->age);
if (node->age == -1) {
free(node);
break;
}
node->id = id;
node->next = NULL;
if (node->age == age) {
free(node);
continue;
}
if (head == NULL) {
head = tail = node;
} else {
tail->next = node;
tail = node;
}
id++;
}
return head;
}
```
该函数使用了一个循环来创建结点。在每次循环中,根据用户的输入创建一个新的结点,并将其插入到链表中。如果用户输入的年龄等于指定的年龄,则直接跳过该结点。如果用户输入的年龄是-1,则表示输入结束,停止循环。
最后,可以编写一个函数来遍历链表,并输出每个结点的数据。
```c
void printList(struct student* head) {
struct student* p = head;
while (p != NULL) {
printf("学号:%-5d 姓名:%-10s 性别:%s 年龄:%d\n", p->id, p->name, p->gender, p->age);
p = p->next;
}
}
```
完整的代码如下所示:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student {
int id;
char name[20];
char gender[5];
int age;
struct student *next;
};
struct student *createList(int age) {
struct student *head = NULL;
struct student *tail = NULL;
int id = 1;
while (1) {
struct student *node = (struct student*)malloc(sizeof(struct student));
printf("请输入第%d个学生的姓名、性别、年龄(用空格分隔):", id);
scanf("%s %s %d", node->name, node->gender, &node->age);
if (node->age == -1) {
free(node);
break;
}
node->id = id;
node->next = NULL;
if (node->age == age) {
free(node);
continue;
}
if (head == NULL) {
head = tail = node;
} else {
tail->next = node;
tail = node;
}
id++;
}
return head;
}
void printList(struct student* head) {
struct student* p = head;
while (p != NULL) {
printf("学号:%-5d 姓名:%-10s 性别:%s 年龄:%d\n", p->id, p->name, p->gender, p->age);
p = p->next;
}
}
int main() {
int age;
printf("请输入要删除的年龄:");
scanf("%d", &age);
struct student *head = createList(age);
printf("链表中的学生信息如下:\n");
printList(head);
return 0;
}
```
阅读全文