编辑代码

#include <stdio.h>  

#include <stdio.h>
#include <stdlib.h>

// 定义链表结点结构体
typedef struct Node {
    int data; // 数据域
    struct Node *next; // 指针域,指向下一个结点
} Node;

// 创建带头结点的单链表
Node *createList() {
    Node *head = (Node *)malloc(sizeof(Node)); // 分配头结点空间
    head->next = NULL; // 初始化头结点的指针域为NULL
    return head; // 返回头结点指针
}

// 向链表中插入元素
void insert(Node *head, int data) {
    Node *newNode = (Node *)malloc(sizeof(Node)); // 分配新结点空间
    newNode->data = data; // 设置新结点的数据域
    newNode->next = head->next; // 将新结点的指针域指向头结点的下一个结点
    head->next = newNode; // 将头结点的指针域指向新结点
}

// 删除带头结点的单链表中最小的一个结点
void deleteMinNode(Node *head) {
    if (head == NULL || head->next == NULL) {
        return; // 如果链表为空或只有一个结点,直接返回
    }

    Node *minPrev = NULL; // 最小值的前驱结点
    Node *minNode = head->next; // 最小值结点
    Node *prev = head; // 当前结点的前驱结点
    Node *cur = head->next; // 当前结点

    // 遍历链表,找到最小值结点及其前驱结点
    while (cur != NULL) {
        if (cur->data < minNode->data) {
            minNode = cur;
            minPrev = prev;
        }
        prev = cur;
        cur = cur->next;
    }

    // 删除最小值结点
    minPrev->next = minNode->next; // 否则,更新最小值结点的前驱结点的指针域
    free(minNode); // 释放最小值结点的内存空间
}

int main() {
    Node *head = createList(); // 创建带头结点的单链表
    insert(head, 5);
    insert(head, 3);
    insert(head, 7);
    insert(head, 1);
    insert(head, 9);

    deleteMinNode(head); // 删除最小的结点

    // 打印链表元素
    Node *cur = head->next;
    while (cur != NULL) {
        printf("%d ", cur->data);
        cur = cur->next;
    }
    printf("\n");

    return 0;
}