/****************************************
* 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;
}