编写程序实现:使用后插法建立一个带头结点的存储学生信息的单链表,并将建立后的学生链表中的信息输出到屏幕上,学生的结构体类型可自行定义。”添加一个函数 fsearch,该函数的功能用于实现:从键盘上输入一个姓名,在单链表中查找该姓名的学生是否存在(考虑可能有重名的情况)。若存在,则输出学生的详细信息,若不存在,给出相应的提示 具体要求 1.单链表的建立和单链表的品示分别使用函数实现,学号为 0,结束输入。
时间: 2024-03-22 08:41:40 浏览: 61
建立一个带头节点的双向链表
好的,以下是实现过程:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义学生结构体
typedef struct student {
int id; // 学号
char name[20]; // 姓名
int age; // 年龄
struct student *next; // 指向下一个学生的指针
} Student;
// 创建学生链表并返回头指针
Student *create_list() {
Student *head = (Student *)malloc(sizeof(Student)); // 创建头结点
head->next = NULL; // 初始时链表为空
Student *p = head; // p指向链表的最后一个结点
int id, age;
char name[20];
printf("请输入学生信息(学号为0时停止输入):\n");
while (1) {
printf("学号:");
scanf("%d", &id);
if (id == 0) {
break;
}
printf("姓名:");
scanf("%s", name);
printf("年龄:");
scanf("%d", &age);
Student *new_node = (Student *)malloc(sizeof(Student)); // 创建新结点
new_node->id = id;
strcpy(new_node->name, name);
new_node->age = age;
new_node->next = NULL;
p->next = new_node; // 将新结点链接到链表尾部
p = new_node; // p指向链表的最后一个结点
}
return head;
}
// 输出学生链表中的信息
void print_list(Student *head) {
printf("学生信息如下:\n");
Student *p = head->next; // p指向链表的第一个结点
while (p != NULL) {
printf("学号:%d\t姓名:%s\t年龄:%d\n", p->id, p->name, p->age);
p = p->next; // 移动到下一个结点
}
}
// 查找学生
void fsearch(Student *head) {
char name[20];
printf("请输入要查找的姓名:");
scanf("%s", name);
int found = 0; // 是否找到标记
Student *p = head->next; // p指向链表的第一个结点
while (p != NULL) {
if (strcmp(p->name, name) == 0) { // 找到了
printf("学号:%d\t姓名:%s\t年龄:%d\n", p->id, p->name, p->age);
found = 1;
}
p = p->next; // 移动到下一个结点
}
if (!found) {
printf("未找到该学生!\n");
}
}
int main() {
Student *head = create_list();
print_list(head);
fsearch(head);
return 0;
}
```
程序运行示例:
```
请输入学生信息(学号为0时停止输入):
学号:1
姓名:John
年龄:18
学号:2
姓名:Mary
年龄:20
学号:3
姓名:John
年龄:22
学号:0
学生信息如下:
学号:1 姓名:John 年龄:18
学号:2 姓名:Mary 年龄:20
学号:3 姓名:John 年龄:22
请输入要查找的姓名:John
学号:1 姓名:John 年龄:18
学号:3 姓名:John 年龄:22
```
阅读全文