使用尾插法建立一个带头结点的存储学生信息(学号, 姓名)的单链表(学号为0,结束),然后从键盘上输入一个姓名,在单链表中查找该姓名的学生是否存在(可虑可能有重名的情况)。若存在,则输出学生的详细信息,若不存在,给出提示信息NotFound。
时间: 2024-02-15 11:04:17 浏览: 76
好的,这是一个关于链表和查找的问题。为了回答这个问题,我将提供一份C代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 20
typedef struct Student {
int id;
char name[MAX_NAME_LEN];
struct Student* next;
} Student;
Student* create_list() {
Student* head = (Student*) malloc(sizeof(Student));
head->id = 0;
head->next = NULL;
return head;
}
void print_list(Student* head) {
Student* p = head->next;
while(p != NULL) {
printf("id:%d name:%s\n", p->id, p->name);
p = p->next;
}
}
void insert_node(Student* head, int id, char* name) {
Student* p = head;
while(p->next != NULL) {
p = p->next;
}
Student* node = (Student*) malloc(sizeof(Student));
node->id = id;
strcpy(node->name, name);
node->next = NULL;
p->next = node;
}
void search(Student* head, char* name) {
Student* p = head->next;
while(p != NULL) {
if(strcmp(p->name, name) == 0) {
printf("Found: id:%d name:%s\n", p->id, p->name);
return;
}
p = p->next;
}
printf("Not Found\n");
}
int main() {
Student* head = create_list();
insert_node(head, 1, "Alice");
insert_node(head, 2, "Bob");
insert_node(head, 3, "Charlie");
insert_node(head, 4, "David");
insert_node(head, 5, "Eva");
printf("The student list is:\n");
print_list(head);
char name[MAX_NAME_LEN];
printf("Please input a name to search:");
scanf("%s", name);
search(head, name);
return 0;
}
```
这个代码中,`Student`是一个结构体,包含学生的学号和姓名,以及下一个学生的指针。`create_list()`函数创建一个带头结点的空链表。`insert_node()`函数使用尾插法将一个学生节点插入链表中。`print_list()`函数遍历链表,打印每个学生的信息。`search()`函数在链表中查找指定姓名的学生,若找到则输出其详细信息,否则输出"Not Found"。在`main()`函数中,我们创建一个学生链表,输入一个姓名并在链表中查找该学生。
希望这份代码能够回答你的问题。
阅读全文