【算法6】删除单链表L中删除一个最小值结点的高效算法(假设最小值结点是唯一的)

【算法6】删除单链表L中删除一个最小值结点的高效算法(假设最小值结点是唯一的),第1张

算法6】删除单链表L中删除一个最小值结点的高效算法(假设最小值结点是唯一的)

算法思路

定义四个指针:
p用于遍历链表,pre用于保存p的前驱防止断链。
minp用于标记当前链表最小值,minpre用于保存minp的前驱防止断链,方便删除。

算法设计

1)设计链表结点结构体

typedef struct LNode
{
	int data;//数据域
	struct LNode* next;//指向后继的指针
}LNode,*linkList;//给struct LNode起别名:LNode,给LNode* 起别名linkList

2)Del_min() 设计

void Del_Listmin(linkList L)
{
	LNode* pre=L;
	LNode* p=pre->next;

	LNode* minpre=L;
	LNode* minp=minpre->next;
	
	
	while(p)
	{
		if(p->datadata)
		{
			minp=p;
			minpre=pre;
			pre=p;
			p=p->next;
		}
		else
		{
			pre=p;
			p=p->next;
		}
	}
	
	
	minpre->next=minp->next;
	free(minp);
}

为了方便查看链表信息,设计一个查看链表元素的函数
ShowList(linkList L)

//查看传入链表的结点值情况

void ShowList(linkList L)
{
	LNode* p=L->next;

	while(p)
		{
			if(p->next)
			{
				printf("%d->",p->data);
			}
			else
			{
				printf("%d",p->data);
			}
			p=p->next;
		}
	printf("n");
}

尾插法创建链表算法

//尾插法创建链表
linkList Creat_linkList()
{

	LNode* s=NULL;//s用于标记插入结点
	int input=0;
	linkList L=(LNode*)malloc(sizeof(LNode));
	LNode* rear=L;//建立尾指针指向链表最后一个元素
	printf("请输入整型数据,回车确认,输入-1完成链表创建:n");
	scanf("%d",&input);
	while(input!=-1)
	{
		s=(LNode*)malloc(sizeof(LNode));
		s->data=input;
		rear->next=s;
		rear=s;
		scanf("%d",&input);
	}
	rear->next=NULL;
	printf("链表建立成功!n");

	return L;
}

main.c中执行代码如下:

int main()
{
	linkList L=Creat_linkList();
	ShowList(L);
	Del_Listmin(L);
	ShowList(L);
	return 0;
}

结果如图所示:

1表示链表结束

链表中有些常用过的方法可以自己整理成文件 linkList.h

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5714468.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存