qfedu-c-level/day13/d9_3_delete.c

88 lines
2.0 KiB
C
Raw Permalink Normal View History

#include <stdio.h>
#include <stdlib.h>
// 定义学生信息的数据结构,链表的节点
typedef struct stu_s
{
char sid;
char name[32];
int age;
struct stu_s *next;
} STU;
void shows(STU *head)
{
STU *pi = head;
printf("学号\t姓名\t年龄\n");
while (NULL != pi)
{
printf("%d\t%s\t%d\n", pi->sid, pi->name, pi->age);
pi = pi->next;
}
}
STU *delete_stu(STU *head, char sid)
{
if (NULL == head)
{
printf("链表为空,无法删除\n");
return NULL;
}
if (head->sid == sid)
{
// 如果 head 节点的内存是在堆区分配的,那么需要释放
// STU *tmp = head;
head = head->next;
// free(tmp);
// return head;
}
else
{
STU *pi = head;
while (NULL != pi->next && pi->next->sid != sid)
{
pi = pi->next;
}
// 如果没有找到删除的节点
if (NULL == pi->next)
{
printf("没有找到要删除的节点\n");
return head;
}
// 找到了要删除的节点
STU *pn = pi->next; // 要删除的节点
pi->next = pn->next; // 要删除的节点的前一个节点指向要删除的节点的后一个节点
free(pn); // 释放要删除的节点
printf("删除成功\n");
// return head;
}
return head;
}
int main()
{
// 静态生成学生信息的链表
STU s1 = {1, "张三", 18, NULL}; // 头节点: 参数说明: 学号, 姓名, 年龄, 下一个节点的地址
STU s2 = {2, "李四", 19, NULL};
STU s3 = {3, "王五", 20, NULL};
STU *head = &s1; // 头节点
s1.next = &s2; // 头节点指向第二个节点
s2.next = &s3; // 第二个节点指向第三个节点
s3.next = NULL; // 第三个节点指向空
printf("1 %p\n", head);
shows(head);
head = delete_stu(head, 1);
printf("1 %p\n", head);
shows(head);
return 0;
}