创建一个单向链表,存放十个学生的学号,姓名,并输入这种十个学生的信息。在链表中查找指定学号的学生,输入其姓名。在链表中删除指定学号的学生,然后输出其余学生的信息
时间: 2024-02-12 21:05:55 浏览: 18
好的,我可以帮你回答这个问题。
首先,我们要定义一个学生的结构体,包括学号和姓名:
```c
typedef struct student {
int num; // 学号
char name[20]; // 姓名
struct student *next; // 指向下一个节点的指针
} Student;
```
接下来,我们可以编写一个函数来创建一个包含十个学生信息的单向链表:
```c
Student *createList() {
Student *head = NULL; // 头指针
Student *tail = NULL; // 尾指针
// 循环十次,输入每个学生的信息并插入链表
for (int i = 1; i <= 10; i++) {
Student *node = (Student *)malloc(sizeof(Student)); // 创建一个新节点
printf("请输入第 %d 个学生的学号和姓名:", i);
scanf("%d %s", &node->num, node->name);
node->next = NULL;
if (head == NULL) { // 第一个节点
head = tail = node;
} else {
tail->next = node;
tail = node;
}
}
return head;
}
```
接下来,我们可以编写一个函数来查找指定学号的学生,输入其姓名:
```c
void findStudent(Student *head) {
int num;
printf("请输入要查找的学生的学号:");
scanf("%d", &num);
Student *p = head;
while (p != NULL) {
if (p->num == num) {
printf("学号为 %d 的学生姓名是 %s\n", num, p->name);
return;
}
p = p->next;
}
printf("未找到学号为 %d 的学生\n", num);
}
```
最后,我们可以编写一个函数来删除指定学号的学生,并输出其余学生的信息:
```c
void deleteStudent(Student **head) {
int num;
printf("请输入要删除的学生的学号:");
scanf("%d", &num);
Student *p = *head;
Student *prev = NULL;
while (p != NULL) {
if (p->num == num) {
if (prev == NULL) { // 如果要删除的是第一个节点
*head = p->next;
} else {
prev->next = p->next;
}
free(p);
printf("学号为 %d 的学生已删除\n", num);
return;
}
prev = p;
p = p->next;
}
printf("未找到学号为 %d 的学生\n", num);
}
void printList(Student *head) {
printf("学号\t姓名\n");
Student *p = head;
while (p != NULL) {
printf("%d\t%s\n", p->num, p->name);
p = p->next;
}
}
int main() {
Student *head = createList();
findStudent(head);
deleteStudent(&head);
printList(head);
return 0;
}
```
以上就是创建一个单向链表,存放十个学生的学号,姓名,并输入这种十个学生的信息。在链表中查找指定学号的学生,输入其姓名。在链表中删除指定学号的学生,然后输出其余学生的信息的完整代码。