首页 > 其他分享 >[数据结构] 删除单链表中最小值结点(C语言版本)

[数据结构] 删除单链表中最小值结点(C语言版本)

时间:2024-10-23 20:19:32浏览次数:3  
标签:结点 LNode min next minpre 表中 C语言 previous

如果对单链表基本操作或概念不理解的可以跳转:

单链表的基本操作(C语言版)-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/m0_74181956/article/details/143082621?spm=1001.2014.3001.5501

算法思想:

如图所示:定义指针p 为L的第一个结点,pre为L的头结点,min为记录每次遍历的最小值结点,minpre为记录最小值结点的上一个结点,p和pre 逐次遍历单链表,p与min进行比较,若是p中的节点值小于min中的节点值,那么就让min移动到此时p结点的位置,当遍历完全后,min此时就指向了链表中最小的值结点,此时通过minpre就可以完整min所指结点的释放

void delete_min(LinkList L)
{
    LNode*p=L->next;
    LNode*previous=L;
    LNode*min=p;
    LNode*minpre=previous;
    while(p!=NULL)
    {
        if(p->data<min->data)
        {
            min=p;
            minpre=previous;
        }
        previous=p;
        p=p->next;
    }
        minpre->next=min->next;
        free(min);
}
可运行的完整示例代码:

#include"stdio.h"
#include"stdlib.h"
typedef struct LNode
{
    int data;
    struct LNode*next;
}LNode,*LinkList;

void wei_insert(LinkList L)
{
    int x;
    printf("请输入单链表元素,空格隔开,直到出现“-1”结束:");
    scanf("%d",&x);
    LNode*r=L;
    while(x!=-1)
    {
        LNode*s=(LNode*)malloc(sizeof(LNode));
        s->data=x;
        r->next=s;
        r=s;
        scanf("%d",&x);
    }
    r->next=NULL;
}

void delete_min(LinkList L)
{
    LNode*p=L->next;
    LNode*previous=L;
    LNode*min=p;
    LNode*minpre=previous;
    while(p!=NULL)
    {
        if(p->data<min->data)
        {
            min=p;
            minpre=previous;
        }
        previous=p;
        p=p->next;
    }
        minpre->next=min->next;
        free(min);
}

void print_list(LinkList L)
{
    LNode*p=L->next;
    while(p!=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}

void free_list(LinkList L)
{
    LNode*p=L->next;
    while(p!=NULL)
    {
        LNode*q=p;
        p=p->next;
        free(q);
    }
    free(L);
}

int main()
{
    LinkList L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
    wei_insert(L);
    printf("删除最小节点后的单链表:");
    delete_min(L);
    print_list(L);
    free_list(L);
}

标签:结点,LNode,min,next,minpre,表中,C语言,previous
From: https://blog.csdn.net/m0_74181956/article/details/143191118

相关文章

  • 数据结构C语言版_队列笔记||已测试所有代码均可运行
    队列源文件使用markdown编写,CSDN文章发布好像有部分语法改变。每一部分我都有加一个返回标题好像不能使用了。但是CSDN自带一个目录总结,你们无视掉我写的目录直接用CSDN的吧。总结笔记不易,如果有帮助到你希望点个赞。所有代码均已在VScode中运行过,部分代码块因为格式原因......
  • C语言趣味编程100例源码分享
    C语言趣味编程100例是学习路上必不可缺的示例,话不多说直接看代码1,百钱百鸡问题include<stdio.h>main(){intcock,hen,chicken;for(cock=0;cock<=20;cock++) /外层循环控制公鸡数量取值范围0~20/for(hen=0;hen<=33;hen++) /内层循环控制母鸡数量取值范围0~30/for(chic......
  • C语言经典20例(输入数组元素,求出最大值和最小值,并输出)
    在c语言中,要实现要实现“输入数组元素,并求出最大值和最小值,并输出”主要步骤主要有以下几步:1.必要的头文件。2.定义数组大小。3.从用户那里接受数组元素的输入4.使用循环遍历数组。找出最大值和最小值5.输出最大值和最小值代码如下:#include<stdio.h>intmain(){......
  • C语言经典20例(二进制数转换为十进制数)
     #include<stdio.h>#include<string.h>//函数原型声明intbinaryToDecimal(constchar*binary);intmain(){charbinary[100];//声明一个字符数组,用于存储用户输入的二进制数,假设最大长度为99intdecimal;//用于存储转换后的十进制数//提示......
  • 明解c语言入门篇练习4-2do语句延伸
    明解c语言练习4-2我们可以看到题目:编写一段程序,像右面这样读取两个整数的值,然后计算出他们之间所有整数的和。上次我发了一段这个练习4-2的代码可以看一下#include<stdio.h>intmain(void){  inta,b,max,min;  intsum=0;  printf("请输入两个整数:......
  • 使用OpenSSl库实现AES-GCM-128算法(C语言)
    在C语言中使用OpenSSL库实现AES-GCM-128算法,并生成GMAC(GaloisMessageAuthenticationCode)消息认证码,通过以下步骤完成:初始化加密环境:创建一个EVP_CIPHER_CTX结构体,用于存储加密过程中的所有必要信息。设置加密算法:指定使用AES-GCM模式,以及密钥和IV(初始化向量)。处理附加认证......
  • 对于C语言,什么算作normal exit
    在C语言中,atexit()函数用于注册程序正常退出时要执行的清理函数。这个函数会在程序正常退出时自动调用,以执行任何需要在程序结束时清理的操作,例如关闭文件、释放动态分配的内存等。要理解atexit()函数的行为,首先需要明确什么算作**"normalexit"**(正常退出)。什么是"norma......
  • c语言基础程序——经典100道实例。
    c语言基础程序——经典100道实例001,组无重复数字的数002,企业发放的奖金根据利润提成003,完全平方数004,判断当天是这一年的第几天005,三个数由小到大输出006,输出字母C图案007,特殊图案008,9*9乘法表009,国际象棋棋盘010,打印笑脸011,兔子生崽012,101到200的素数013,水仙花数014,分......
  • 关于我、重生到500年前凭借C语言改变世界科技vlog.8——函数递归
    文章目录1.递归的介绍2.递归的限制条件3.递归实战应用3.1求n的阶乘3.2顺序打印一个整数的每一位4.递归与迭代5.递归经典问题的拓展希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力!1.递归的介绍在vlog.2的printf函数的返回值举例中,我们使......
  • 10/22二叉树 求度为1的结点个数
    includeusingnamespacestd;typedefstructBiNode{chardata;structBiNode*lchild,*rchild;}BiTNode,*BiTree;voidCreateBiTree(BiTree&T)//创建一个二叉树{charch;cin>>ch;if(ch=='#')T=NULL;else{T=newBiTNode;T->da......