如果对单链表基本操作或概念不理解的可以跳转:
算法思想:
如图所示:定义指针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