1.创建一个单向链表,存放10个学生的学号,姓名,并输出这种10个学生的信息。 2.在链表中查找指定学号的学生,输出其姓名。 3.在链表中删除指定学号的学生,然后输出其余学生的信息。
时间: 2024-02-27 17:52:03 浏览: 107
好的,这是一个关于链表操作的具体问题,下面是我的回答:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LENGTH 20
// 定义学生结构体
typedef struct student {
char id[10];
char name[MAX_NAME_LENGTH];
struct student *next;
} Student;
// 创建学生链表
Student *create_student_list(int n) {
Student *head = NULL;
Student *p = NULL;
for (int i = 0; i < n; i++) {
// 创建新节点
Student *node = (Student *)malloc(sizeof(Student));
if (node == NULL) {
printf("内存分配失败\n");
exit(1);
}
// 输入学生信息
printf("请输入第%d个学生的学号和姓名:", i+1);
scanf("%s %s", node->id, node->name);
node->next = NULL;
// 插入新节点
if (head == NULL) {
head = node;
} else {
p->next = node;
}
p = node;
}
return head;
}
// 输出学生链表
void print_student_list(Student *head) {
printf("学生信息如下:\n");
Student *p = head;
while (p != NULL) {
printf("%s %s\n", p->id, p->name);
p = p->next;
}
}
// 查找学生
void find_student(Student *head, char *id) {
Student *p = head;
while (p != NULL) {
if (strcmp(p->id, id) == 0) {
printf("学号为%s的学生姓名为%s\n", p->id, p->name);
return;
}
p = p->next;
}
printf("未找到学号为%s的学生\n", id);
}
// 删除学生
void delete_student(Student **head, char *id) {
Student *p = *head;
Student *prev = NULL;
while (p != NULL) {
if (strcmp(p->id, id) == 0) {
if (prev == NULL) {
*head = p->next;
} else {
prev->next = p->next;
}
printf("已删除学号为%s的学生\n", p->id);
free(p);
return;
}
prev = p;
p = p->next;
}
printf("未找到学号为%s的学生\n", id);
}
int main() {
// 创建学生链表
Student *head = create_student_list(10);
// 输出学生链表
print_student_list(head);
// 查找学生
char id[10];
printf("请输入要查找的学生的学号:");
scanf("%s", id);
find_student(head, id);
// 删除学生
printf("请输入要删除的学生的学号:");
scanf("%s", id);
delete_student(&head, id);
// 输出删除后的学生链表
print_student_list(head);
return 0;
}
```
上面的代码实现了以下功能:
1. 创建一个单向链表,存放10个学生的学号和姓名,并输出这10个学生的信息。
2. 在链表中查找指定学号的学生,并输出其姓名。
3. 在链表中删除指定学号的学生,并输出其余学生的信息。
注:在删除学生时,需要使用指向指针的指针,以便在删除节点后修改头节点的值。
阅读全文