(8)数据结构与算法-有空头链表的查找、修改与删除

查找指定节点

查找节点数据

思路大致都是一样的,找到节点是关键

思路

传参:查找节点,要传节点,头指针也要传
1.合法性判断
2.循环找数据
3.返回找到的数据

具体代码

struct Chain *FindiData(struct Chain*pHead, int iData)
{
	if (NULL == pHead)
		return NULL;
	struct Chain *pTemp = pHead->pNext;
	while (pTemp != NULL)
	{
		if (pTemp->iData = iData)
			break;
		pTemp = pTemp->pNext;
	}
	if (NULL == pTemp)
		return NULL;
	return pTemp;
}

查找节点下标

思路

1.传参:这里就要 传节点下标了
2.合法性检测
3.查找节点

具体代码

struct Chain *FindiIndex(struct Chain *pHead, int Index)
{
	if (NULL == pHead || Index < 0)
		return NULL;
	struct Chain *pTemp = pHead->pNext;
	int Sign = 0;
	while (pTemp != NULL)
	{
		if (Sign == Index)
			return pTemp;
		pTemp = pTemp->pNext;
		Sign++;
	}
	return NULL;
}

其实合法性检测时,要让Index<*iCount才是最完善的,由于我懒癌发作,就姑且先算了吧,你们不要忘了哈

修改指定节点

通过查找下标修改

思路

1.合法性检测
2.查找
3.修改
4.如此简单,不想都会,但又何止要想

具体代码

void MoidiData2(struct Chain *pHead,int Index,int iData,int *iCount)
{
	//参数合法性检测
	if (NULL == pHead || Index < 0 || Index > *iCount)
		return;
	//查找
	struct Chain *pTemp = FindiIndex(pHead,Index);
	if (pTemp == NULL)
		return;
	//修改
	pTemp->iData = iData;
}

通过查找数据修改多个节点

思路

1.参数合法性检测
2.循环找节点,在循环里修改,并不断继续找,就能达到修改多个节点的效果
3.是不是只是复习知识点呢,亲!

具体代码

void ModiData1(struct Chain *pHead, int iData, int Data)
{
	if (NULL == pHead)
		return;
	struct Chain *pTemp = pHead->pNext ;
	while (NULL != pTemp)
	{
		if (iData == pTemp->iData)
			pTemp->iData = Data;
		pTemp = pTemp->pNext;
	}
	if (pTemp == NULL)
		return;
}

删除指定节点

根据下标删除指定节点

思路

1.参数合法性检测
2.利用根据下标查找节点的函数来查找要删除的前一个节点
3.指针指向要删除的节点,记录位置
4.重新指向
5.释放节点,即删除
6.数量要减

具体代码

void DeleteMore(struct Chain *pHead,int iData,int *iCount)
{
	if (NULL == pHead)
		return;
	struct Chain *pTemp = pHead;
	while (NULL != pTemp->pNext )
	{
		if (pTemp ->pNext ->iData == iData)
		{
			struct Chain *pT = pTemp ->pNext ;
			pTemp->pNext = pT->pNext;
			pT->pNext = NULL;
			free(pT);
			(*iCount)--;
			continue;
		}
		pTemp = pTemp->pNext;
		
	}
}

删除所有指定的数据

思路

1.合法性检测
2.循环遍历链表,判断是否相等
3.断开链表,释放链表

具体代码

void DeleteMore(struct Chain *pHead,int iData,int *iCount)
{
	if (NULL == pHead)
		return;
	//循环遍历
	struct Chain *pTemp = pHead;
	while (NULL != pTemp->pNext )
	{
		if (pTemp ->pNext ->iData == iData)
		{
			struct Chain *pT = pTemp ->pNext ;
			pTemp->pNext = pT->pNext;
			pT->pNext = NULL;
			free(pT);
			(*iCount)--;
			continue;
		}
		pTemp = pTemp->pNext;
		
	}
}

链表的去重

去重:除去相同的数据,即链表中仅有唯一相同的数据

思路

1.合法性检测:用到去重的话,肯定是有两个一样的情况,所以节点就要保证在两个以上
2.去重就要找两个节点,进行比较,可以标记两个节点,进行循环嵌套,就可以达到去重的结果

具体代码

void RemoveDup(struct Chain *pHead,int *iCount)
{
	if (NULL == pHead || NULL == pHead->pNext)
		return;
	struct Chain *pTemp = pHead->pNext ;
	while (NULL != pTemp)
	{
		struct Chain *pT = pTemp ;
		while (NULL != pT->pNext )
		{
			if (pTemp->iData == pT->pNext  ->iData)
			{
				struct Chain *Remove = pT->pNext ;
				pT->pNext = Remove->pNext;
				free(Remove);
				(*iCount)--;
				continue;
			}
			pT = pT->pNext;
		}
		pTemp = pTemp->pNext;
	}
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐鑫本鑫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值