首页 > 其他分享 >对链表中最小数据项对应的结点删除

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

时间:2024-04-22 20:26:11浏览次数:11  
标签:数据项 结点 最小 next 链表 NULL

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

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

总结:

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

标签:数据项,结点,最小,next,链表,NULL
From: https://www.cnblogs.com/lzlwyh/p/18151423

相关文章

  • 设计一个算法删除单链表L(有头结点)中的一个最小值结点。
    思路1:定义一个变量=遍历每一个当前地址下面的数据和下一个作比较,谁小把谁的值给这个变量,同时记录这个小值的位置i,依次遍历比较,得到最小值和最小值的结点i的值,然后删除这个结点。思路2:给两个指针,p1,p2开始都指向第一个,然后p2指向下一个地址,和p1下的data作比较,得到的小值的p不动......
  • 2024.04.19每日收获之链表与逻辑操作
    今日处理工作时遇到了一个问题,操作非连发按键时也会唤醒机器,但不会有连发动作,查看代码了解到也是历史遗留问题。它采用掩码形式,将多个按键键值或运算到一起,最后在与收到的按键值与运算来查看该按键是否可以连发,这样有一个弊端,即多个按键的按键值占用多个位,会导致非连发按键的键值......
  • L2-022 重排链表
    原题链接题解找到终点,然后终点往前移,起点往后移,奇数时输出终点所在位置..直到起点终点重合,这时输出尾节点是-1code#include<bits/stdc++.h>usingnamespacestd;structnode{intdata,next,from;}a[100005];intmain(){intstart,n;cin>>start>>n;......
  • 两种解法搞定链表相邻节点交换
    最近还是很喜欢用golang来刷算法题,更接近通用算法,也没有像动态脚本语言那些语法糖,真正靠实力去解决问题。下面这道题很有趣,也是一道链表题目,具体如下:24.SwapNodesinPairsSolvedMediumTopicsCompaniesGivenalinkedlist,swapeverytwoadjacentnodesandreturni......
  • JZ36二叉树排序树与双向链表
    /*structTreeNode{ intval; structTreeNode*left; structTreeNode*right; TreeNode(intx): val(x),left(NULL),right(NULL){ }};*/#include<cstddef>classSolution{public: TreeNode*ans=nullptr; //最终的链表 TreeNode*pre=nullptr; ......
  • 树2-二叉树拷贝, 遍历, 计算叶子结点和高度
    树2-二叉树拷贝,遍历,计算叶子结点和高度二叉树结点typedefstructBinaryNode{charch;structBinaryNode*lChild;structBinaryNode*rChild;}BinaryNode;//叶子结点的数量intsum;二叉树遍历前序//递归遍历(前序)voidRecursion(BinaryNode*roo......
  • 链表4: 循环链表
    链表4-循环链表循环链表的特点:链表的尾结点后继指向头结点循环链表的结构typedefstructNode{intdata;//数据域structNode*nextNode;//后继}Node;循环链表的初始化Node*initHeader(){//创建头结点Node*header=(Node*)malloc(sizeof(No......
  • LeetCode- 19 删除链表的倒数第N个节点
    题目地址https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/参考实现/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*ListNode(intval){t......
  • 链表3: 双链表
    链表3:双链表双链表的结构双链表与单链表最大的不同就是不仅存储了结点的后继,还存储了结点的前驱.创建双链表的数据结构typedefstructNode{structNode*preNode;//前驱intdata;//数据域structNode*nextNode;//后继}Node;双链表初始化//返......
  • 1025 反转链表
    我看其他博客用的reverse,但是下标我真的有点糊涂,以下是参考某位dalao的。#include<bits/stdc++.h>usingnamespacestd;structnode{ intsno; intdata; intnext;}s[100010];intmain(){ intstart,cnt,fz;//start cin>>start>>cnt>>fz; for(inti=0;i<cnt......