编写c程序 设计一个算法删除单链表L(有头结点)中的一个最小值结点。

/****************************************
*  name     :Delmin.c
*  author   :1523940xxxx@163.com
*  data     :2024/04/22
*  function :设计函数算法,实现删除单链表L(有头结点)中的一个最小值结点
*  noto     :None
*
*  CopyRight  (c)   2023-2024   1523940xxxx@163.com   A1l Right Reseverd
*
****************************************/

#include <stdio.h>  
#include <stdlib.h>  
#include <limits.h> // 用于INT_MAX  
  
// 定义单链表的结点结构体  
typedef struct ListNode {  
    int value;  
    struct ListNode *next;  
} ListNode;  
/**************************************************
*
*函数名称: createNode
*函数功能: 创建新结点
*函数参数:
     @int value :所传的自己给的值,用于后面查大小
     @  :
*返回结果:
*注意事项: None
*函数作者: 1523940xxxx@163.com
*创建日期: 2024/04/22
*修改历史:
*函数版本: V1.0
**************************************************/   
ListNode* createNode(int value) {  
    ListNode *newNode = (ListNode*)malloc(sizeof(ListNode));  
    if (newNode) {  
        newNode->value = value;  
        newNode->next = NULL;  
    }  
    return newNode;  
}  
/**************************************************
*
*函数名称: insertNode
*函数功能: 插入新结点到链表尾部
*函数参数:
     @ListNode **head  :头结点的地址
     @int value :所传的自己给的值,用于后面查大小
*返回结果:
*注意事项: None
*函数作者: 1523940xxxx@163.com
*创建日期: 2024/04/22
*修改历史:
*函数版本: V1.0
**************************************************/ 
void insertNode(ListNode **head, int value) {  
    ListNode *newNode = createNode(value);  
    if (*head == NULL) {  
        *head = newNode;  
    } else {  
        ListNode *current = *head;  
        while (current->next != NULL) {  
            current = current->next;  
        }  
        current->next = newNode;  
    }  
}  
/**************************************************
*
*函数名称: deleteMinNode
*函数功能: 删除链表中的最小值结点
*函数参数:
     @ListNode **head  :头结点的地址
     @  :
*返回结果:
*注意事项: None
*函数作者: 1523940xxxx@163.com
*创建日期: 2024/04/22
*修改历史:
*函数版本: V1.0
**************************************************/
void deleteMinNode(ListNode **head) {  
    if (*head == NULL || (*head)->next == NULL) {  
        return; // 链表为空或只有一个头结点,无需删除  
    }  
  
    ListNode *current = (*head)->next; // 从头结点的下一个结点开始遍历  
    ListNode *minNode = current; // 假设第一个结点是最小值结点  
    ListNode *prev = *head; // 用于跟踪最小值结点的前一个结点  
  
    // 找到最小值结点  
    int minValue = minNode->value;  
    while (current != NULL) {  
        if (current->value < minValue) {  
            minValue = current->value;  
            minNode = current;  
            prev = prev->next; // 更新最小值结点的前一个结点  
        }  
        current = current->next;  
    }  
  
    // 删除最小值结点  
    prev->next = minNode->next;  
    free(minNode); // 释放最小值结点的内存  
}  
/**************************************************
*
*函数名称: printList
*函数功能: 打印链表 
*函数参数:
     @ListNode **head  :头结点的地址
     @  :
*返回结果:
*注意事项: None
*函数作者: 1523940xxxx@163.com
*创建日期: 2024/04/22
*修改历史:
*函数版本: V1.0
**************************************************/  
void printList(ListNode *head) {  
    ListNode *current = head->next; // 跳过头结点  
    while (current != NULL) {  
        printf("%d ", current->value);  
        current = current->next;  
    }  
    printf("\n");  
}  
/**************************************************
*
*函数名称: freeList
*函数功能: 释放链表内存 
*函数参数:
     @ListNode **head  :头结点的地址
     @  :
*返回结果:
*注意事项: None
*函数作者: 1523940xxxx@163.com
*创建日期: 2024/04/22
*修改历史:
*函数版本: V1.0
**************************************************/ 
void freeList(ListNode *head) {  
    ListNode *current = head;  
    while (current != NULL) {  
        ListNode *next = current->next;  
        free(current);  
        current = next;  
    }  
}  
/**************************************************
*
*函数名称: main
*函数功能: 一个程序的开口 
*函数参数:
     @  :
     @  :
*返回结果:
*注意事项: None
*函数作者: 1523940xxxx@163.com
*创建日期: 2024/04/22
*修改历史:
*函数版本: V1.0
**************************************************/
int main() {  
    ListNode *head = NULL; // 初始化头结点为NULL  
  
    // 插入一些测试数据  
    insertNode(&head, 0); // 头结点,不存储数据  
    insertNode(&head, 5);  
    insertNode(&head, 3);  
    insertNode(&head, 7);  
    insertNode(&head, 2);  
    insertNode(&head, 2); // 重复的最小值  
  
    printf("Original list: ");  
    printList(head);  
  
    // 删除一个最小值结点  
    deleteMinNode(&head);  
  
    printf("List after deleting a min node: ");  
    printList(head);  
  
    // 释放链表内存  
    freeList(head);  
  
    return 0;  
}
posted @ 2024-04-22 20:16  freeangel123  阅读(71)  评论(0)    收藏  举报