#include #include // 定义学生信息的数据结构,链表的节点 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; }