设计一个算法删除单链表L(有头结点)中的一个最小值结点
/*************************************************
*
* file name:2.c
* author :momolyl@126.com
* date :2024/04/22
* function :设计一个算法删除单链表L(有头结点)中的一个最小值结点
* note :None
*
* CopyRight (c) 2024 momolyl@126.com All Right Reseverd
*
**************************************************/
#include <stdbool.h>
#include <stdlib.h>
/*************************************************
*
* func name :
* func function :
* func parameter:
*
*
* return :None
* note :None
* func author :momolyl@126.com
* date :2024/04/22
* version :V1.0
**************************************************/
typedef int DataType;
typedef struct LkList
{
DataType Data;
struct LkList *Next;
} L;
bool L_MinDel(L *Head)
{
if (Head->Next || Head->Next->Next)
return false; // 链表为空或只有一个结点则删除失败
// 找到最小值结点的地址
L *Min = Head->Next;
L *Phead1 = Head; // 备份头结点的地址
while (Phead1->Next) // 遍历结点
{
Phead1 = Phead1->Next;
Min = (Min->Data) < (Phead1->Data) ? Min : Phead1; // 找出最小的结点地址
}
// 删除最小值结点
L *Phead2 = Head; // 备份头结点的地址
while (Phead2 != Min) // 遍历结点,找到最小值结点的直接前驱结点地址
{
Phead2 = Phead2->Next;
}
// 1.最小值结点为首结点
if (Phead2 == Head)
{
Phead2->Next = Min->Next;
Min->Next = NULL;
free(Min);
Min = NULL;
return true;
}
// 2.最小值结点为尾结点
else if (!Phead2->Next)
{
Phead2->Next = NULL;
free(Min);
Min = NULL;
return true;
}
// 3.最小值结点为中间结点
else
{
Phead2->Next = Min->Next;
Min->Next = NULL;
free(Min);
Min = NULL;
return true;
}