节点从链表中删除

/* 将节点从链表中删除 */
UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove )
{
	/* 获取节点所在的链表 */
	List_t * const pxList = ( List_t * ) pxItemToRemove->pvContainer;

	pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious;
	pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext;

	/* Make sure the index is left pointing to a valid item. */
	if( pxList->pxIndex == pxItemToRemove )
	{
		pxList->pxIndex = pxItemToRemove->pxPrevious;
	}

	/* 初始化该节点所在的链表为空,表示节点还没有插入任何链表 */
	pxItemToRemove->pvContainer = NULL;
	
	/* 链表节点计数器-- */
	( pxList->uxNumberOfItems )--;

	/* 返回链表中剩余节点的个数 */
	return pxList->uxNumberOfItems;
}

我们可以将这段代码比作在一个排队的人中间把某个人移走。想象一下每个人手里都有一个指向前面和后面人的指针,这样大家就能形成一个队列。下面是逐步的解释:

场景设定

假设我们有一个队列,里面的人的顺序是:

Alice -> Bob -> Charlie -> Dave

现在,我们要把中间的 Charlie 移走。

代码的执行过程

1. 找到要移走的人
List_t * const pxList = ( List_t * ) pxItemToRemove->pvContainer;
  • 我们先确定 Charlie 是在哪个队列(链表)中。每个人(节点)都有一个指向自己所在队列的指针。
2. 调整前后连接

现在,我们要把 Charlie 从队列中移除,保证 AliceDave 之间的连接不被打断。

pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious; // Dave's previous points to Bob
pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext;     // Bob's next points to Dave
  • 第一步DavepxItemToRemove->pxNext)要把他的指向前面的人改成 BobpxItemToRemove->pxPrevious),这样 Dave 就指向 Bob 了。
  • 第二步BobpxItemToRemove->pxPrevious)要把他的指向后面的人改成 DavepxItemToRemove->pxNext),这样 Bob 就指向 Dave 了。

经过这两步,队列的顺序变成了:

Alice -> Bob -> Dave

这样,Charlie 被成功移走,队列仍然保持完整。

3. 更新索引

接下来,假设队列里有一个指针(索引)指向当前操作的对象,比如指向 Charlie

if( pxList->pxIndex == pxItemToRemove )
{
    pxList->pxIndex = pxItemToRemove->pxPrevious; // 更新索引指向 Bob
}
  • 如果队列的指针(pxIndex)指向了 Charlie,我们需要把它更新为 Bob,这样指针不会指向一个不存在的人。
4. 清空信息
pxItemToRemove->pvContainer = NULL;
  • 我们将 Charlie 的队列指针设置为 NULL,表示他已经不在任何队列中,避免出现错误引用。
5. 更新队列长度
( pxList->uxNumberOfItems )--;
  • 最后,我们把队列的总人数减 1,表示 Charlie 已经不在队列中了。

总结

在这段代码中,我们通过以下步骤从队列中移走一个人:

  1. 确定要移走的人(节点)所在的队列。
  2. 调整前后指向,确保前后的人可以正常连接。
  3. 如果需要,更新队列指向的当前节点,避免指向一个已删除的人。
  4. 清空被移走的人的队列信息,确保数据完整。
  5. 更新队列的总人数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

李解49

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

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

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

打赏作者

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

抵扣说明:

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

余额充值