栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【算法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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/718148.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号