数据结构 链表笔试题1

设计一个算法删除单链表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;
    }

posted @ 2024-04-23 01:27  铃是铃铛的铃  阅读(19)  评论(0)    收藏  举报