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

标签 c list doubly-linked-list circular-list

我在结构中有一个列表,

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/

相关文章:

java - 如何检索列表中具有某些属性的所有对象?

c - 如何将结构中的空指针分配给另一个结构?

c - 我是否正确地在 C 中实现了双向链表的删除节点函数?

c - C语言实现双向链表

c - omp parallel 用于输出顺序

c - 将 HGLOBAL DIB 数据写入文件时遇到问题

c - sleep() 延迟输出直到结束

python - 包含空(或无)元素的随机列表

c - 转换说明符如何工作?

java - 不兼容的类型 List 和 ArrayList 的 ArrayList