已知5个学生的信息存储在一个链表中,编写函数实现数据的删除:从已有链表中删除一个学生(根据学生的姓名删除)。在main函数中输出删除后的结果。 测试用例: 输入(前5行是5个学生的信息,最后一行是待删除的学生姓名) 输出 104 bai 77 102 li 80 105 yang 89 101 zhang 90 103 wang 96 yu Not Found 104 bai 77 102 li 80 105 yang 89 101 zhang 90 103 wang 96 bai 102 li 80 105 yang 89 101 zhang 90 103 wang 96 104 bai 77 102 li 80 105 yang 89 101 zhang 90 103 wang 96 zhang 104 bai 77 102 li 80 105 yang 89 103 wang 96用C语言
时间: 2023-06-04 07:08:40 浏览: 94
C语言链表,写入删除
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//定义学生结构体
typedef struct student {
int id; //学号
char name[20]; //姓名
int score; //成绩
struct student *next;
} Student;
//从链表中删除指定学生
int deleteStudent(Student *head, char *name) {
Student *p = head->next; //p指向第一个学生
Student *pre = head; //pre指向头结点
while (p != NULL) {
if (strcmp(p->name, name) == 0) { //找到了指定学生
pre->next = p->next;
free(p); //释放指定学生所占内存
return 1;
}
pre = p;
p = p->next;
}
return 0; //未找到指定学生
}
int main() {
//定义链表头结点
Student *head = (Student*)malloc(sizeof(Student));
head->next = NULL;
//插入5个学生的信息
Student *p = head;
for (int i = 1; i <= 5; i++) {
Student *node = (Student*)malloc(sizeof(Student));
printf("请输入第%d个学生的信息(id name score): ", i);
scanf("%d %s %d", &node->id, node->name, &node->score);
node->next = NULL;
p->next = node;
p = node;
}
//输出原始链表中的学生信息
printf("原始链表中的学生信息:\n");
p = head->next;
while (p != NULL) {
printf("%d %s %d\n", p->id, p->name, p->score);
p = p->next;
}
char delName[20]; //待删除的学生姓名
printf("请输入待删除的学生姓名: ");
scanf("%s", delName);
//从链表中删除指定学生
if (deleteStudent(head, delName)) {
printf("%s 已被删除!\n", delName);
}
else{
printf("%s 未找到!\n", delName);
}
//输出删除后的链表中的学生信息
printf("删除后的链表中的学生信息:\n");
p = head->next;
while (p != NULL) {
printf("%d %s %d\n", p->id, p->name, p->score);
p = p->next;
}
//释放链表中所有学生所占内存
p = head->next;
while (p != NULL) {
Student *temp = p;
p = p->next;
free(temp);
}
//释放头结点所占内存
free(head);
return 0;
}
阅读全文