对链表中最小数据项对应的结点删除

// 指的是顺序表中的元素的数据类型,用户可以根据需要进行修改

typedef int DataType_t;

// 构造链表SeqList—_t的结点,结点中包含数据域和指针域,并且所有结点中的数据应该相同

typedef struct SeqList
{
    DataType_t  Data;
    struct SeqList  *next;
} LinkList_t;

//创建一个空链表,空链表中有一个头结点,并对链表初始化

LinkList_t *LLIst_Create(void)
{
    //创建一个头结点并为头结点申请内存
    LinkList_t *Head=(SeqList_t *)calloc(1,sizeof(LinkLIst_t));
    if(NULL==Head){
        perror("Calloc memeroy for Head is Failed");
        exit(-1);
    }
    //对头结点进行初始化,头结点不存储有效数据
    Head->next=NULL;
}

//设计一个算法删除单链表L(有头结点)中的一个最小值结点

bool  LinkList_DelMin (SeqList_Del *L)
{
    //判断链表是否为空
    if(NULL==Head->next){
        perror("LinkList is void");
        return false;
    }
    //遍历链表元素,并记录最小的数据项及其地址
    DataType_t *temp=Head;        //定义变量遍历所有节点
    DataType_t min=*(Head->next->Data);  //定义变量并初始化为首结点数据项,遍历后记录最小的数据
    DataType_t *p=Head->next; //定义变量并初始化为首结点的地址后记录最小结点的地址
    DataType_t *q=Head->next;//定义变量并初始化为头结点的地址后记录最小节点直接前驱的地址
    //判断当前节点的直接后继结点是否为尾结点
    while(temp->next){
    //判断当前节点直接后继中的数据项与最小结点的数据项大小
        if(min<temp->next->Data){
            min=temp->next->Data;//如果符合,记录最小数据项
            p=temp->next;//记录最小数据项所在结点
            q=temp;//记录最小数据项直接前驱结点
            }
        temp=temp->next;//遍历后续结点
    }
    ###//删除最小数据项所在的结点
    //当首结点为最小项时
    if(p=Head->next){
        Head->next=p->next;     //头结点的指针域指向首元素的下一结点的地址
        p->next=NULL;       //释放原首结点的指针域和数据域
        p->Data=0;          //清除原首结点中数据项的数据
        p=NULL;             //清除自定义变量p和temp的数据
        temp=NULL;          //清除遍历链表的指针
        return true;
    }
    //尾结点为最小项时
    if(p->next==NULL){
        p->Data=0;          //清除原尾结点数据项中的数据
        p==NULL;            //清除指向最小结点的指针中的数据
        q->next=NULL;       //将最小结点直接前驱作为尾指针
        temp=NULL;          //清除遍历链表的指针
        return ture;
    }
    //中间结点为最小项时
    else{
        q->next=p->next;    //最小结点直接前驱的指针域指向最小结点的直接后继
        p->next=NULL;       //将最小结点的指针域指向NULL
        p->Data=0;          //将原最小结点的值清零
        p=NULL;             //清除指向原最小结点的指针;
        return ture;
    }
}

//查找链表中倒数第K项的结点 成功返回1,否则返回0

int LinkList_Find(LinkList_t *head,int k)
{
    //定义指针记录当前位置的结点
    LinkList_t *Now=head;
    //定义指针记录相差K-1个结点的结点
    LinkList_t *p=head;
    for(int i=0;i<k;i++){
        //判断当前结点的指针域为NULL,则表示已到达尾指针,不存在倒数第K项
        if(NULL==Now->next){
            return 0;
        }
        Now=Now->next;
    }
    //判断当前结点是否为尾结点,不是则同步向后遍历
    while(Now->next){
        Now=Now->next;
        p=p->next;
    }
    return 1;
}

总结:

删除链表中结点前,应当判断链表是否为空
删除链表中结点时,应当注意“先连接,后断开”的规则
删除链表中结点时,应当先判断需要删除的结点位于链表的什么位置,位置不同,连接和断开的位置也是不同的

posted @   林大官人995  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示