#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;
}