gpt4 book ai didi

c - 解读自定义循环双向链表的循环条件

转载 作者:太空宇宙 更新时间:2023-11-04 06:14:07 25 4
gpt4 key购买 nike

我在结构中有一个列表,

struct A{
list B;
};

我也有一个指向这个结构的指针,比如

struct A *a;

现在,假设列表已经实现,并且它的元素是 elem 类型。

然后,我执行以下操作 -

(i) 我在 nodeL 中获取列表的头部(elem 类型的指针)

elem * nodeL = list_get_head(&(a->B));

(ii) 我现在以这种方式遍历列表:

while(nodeL != (elem *)(&a->B)){ // did not get this part ----- I
; //some code here
nodeL = list_get_next(&(a->B), nodeL);
}

假设 list_get_head 获取指向列表头部的指针,list_get_next 获取指向传递的第二个参数 elem 的下一个元素的指针,列表。

现在我的问题是:

  1. 我的循环条件是什么?我希望循环到什么列表? (见I)换句话说,如果&(a->B)是链表的开始地址,那么&a->B 在这里?

我认为这应该循环到列表末尾,但它似乎不是 while 循环条件正在做的事情。另外,这是一个循环双向链表。

最佳答案

elem* x = list_get_head(&a->B);
elem* y = (elem *)(&a->B);

首先,xy 在您的情况下有多大差异?

要完全有效,list 的第一个成员无论如何都必须是 elem* 类型。我个人会假设这是列表的头部,但是你的 while 循环永远不会被输入,所以它一定是尾部???但是你在循环中考虑的第一个元素是尾部......

如何表示一个空列表?空指针?如果是这样,则您的代码不包含此内容。

while(nodeL != (elem *)(&a->B))

did not get this part

想法很简单:我们从头部开始迭代,只要没有到达头部再次,我们仍然在循环中......问题是,你必须区分两种情况:

  1. 当前节点在循环开始时是头部
  2. 迭代完所有元素后当前节点为head

我现在建议对迭代进行不同的处理:

elem* nodeL = list_get_head(&a->B);
if(nodeL) // based on assumption(!): otherwise, empty list
{
do
{
//some code here
nodeL = list_get_next(&a->B, nodeL);
}
while(nodeL != list_get_head(&a->B));
}

一个元素保证在列表中,因此我们可以无条件地使用它(因此是一个 do-while 循环)。然后我们迭代到下一个元素,直到我们再次到达起点。我用对 list_get_head 的另一个调用替换了可疑的转换,使整个事情更安全(不再依赖假设)。

关于c - 解读自定义循环双向链表的循环条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49750860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com