我在结构中有一个列表,
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
的下一个元素的指针,列表。
现在我的问题是:
- 我的循环条件是什么?我希望循环到什么列表? (见
I
)换句话说,如果&(a->B)
是链表的开始地址,那么&a->B
在这里?
我认为这应该循环到列表末尾,但它似乎不是 while 循环条件正在做的事情。另外,这是一个循环双向链表。
最佳答案
elem* x = list_get_head(&a->B);
elem* y = (elem *)(&a->B);
首先,x
和 y
在您的情况下有多大差异?
要完全有效,list
的第一个成员无论如何都必须是 elem*
类型。我个人会假设这是列表的头部,但是你的 while 循环永远不会被输入,所以它一定是尾部???但是你在循环中考虑的第一个元素是尾部......
如何表示一个空列表?空指针?如果是这样,则您的代码不包含此内容。
while(nodeL != (elem *)(&a->B))
did not get this part
想法很简单:我们从头部开始迭代,只要没有到达头部再次,我们仍然在循环中......问题是,你必须区分两种情况:
- 当前节点在循环开始时是头部
- 迭代完所有元素后当前节点为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/