C 打印链接结构的停止条件?

C 打印链接结构的停止条件?,c,recursion,struct,pointers,C,Recursion,Struct,Pointers,我有以下结构: struct cell { int nmbr; struct cell *p; }; 我已经从这种类型创建了一个链接结构链。每个结构都通过*p连接到它的前一个结构。如果我决定使用如下所示的递归算法打印所有nmbrs,我如何定义停止条件 void write(struct cell* l) { /* The following if statement doesn't solve my problem, but hopefully you s

我有以下结构:

struct cell {
    int nmbr;
    struct cell *p;
};
我已经从这种类型创建了一个链接结构链。每个结构都通过*p连接到它的前一个结构。如果我决定使用如下所示的递归算法打印所有
nmbr
s,我如何定义停止条件

void write(struct cell* l) {
    /* The following if statement doesn't solve my problem,
       but hopefully you see what I'm trying to do */
    if (&l != 0x000000) {
        printf("%d \t", l->nmbr);
        write(l->p);
    }
}

此处为当前节点的打印编号

如果(l->p!=NULL)
写入(l->p)

你想要什么

if (l != 0)


当然,您还需要确保链表的尾部也已分配了
p
assigned
NULL
;否则它将是未初始化的,可能不是空的,但无论如何都是无效的。

假设链表不是循环的,当到达空指针时就停止。 改变


您应该检查“l”是否不为NULL,而不是“&l”,假设NULL中的链表已终止

正如其他人所说,您应该检查l(el),而不是&l,与0或NULL比较。因此,您的函数应该如下所示:

void write(CELL* l) {
    if (l != 0x000000) {
        printf("%d \t", l->nmbr);
        write(l->p);
    }
}
也就是说,很容易用一段时间完成同样的事情,从而避免递归的开销:

  list_pos = list_head;
  while (list_pos != NULL) {
    printf("%d \t", list_pos->nmbr);
    list_pos = list_pos -> p;
  }

原因是l是指针,您需要检查指针值是否为null,而不是指针值的指针。这不适用于直接传递
write()
而不是递归调用
null
的情况。唯一可能发生的情况是用户直接用null调用它。即使打印在内部,如果用户可以简单地传递一个错误的非空引用,那么这并不能真正使程序更安全。为什么在这种情况下使用递归?while循环的执行速度可能比每个项调用函数的开销快得多。在你的情况下,表现重要吗?
if (l != NULL)
void write(CELL* l) {
    if (l != 0x000000) {
        printf("%d \t", l->nmbr);
        write(l->p);
    }
}
  list_pos = list_head;
  while (list_pos != NULL) {
    printf("%d \t", list_pos->nmbr);
    list_pos = list_pos -> p;
  }