【问题标题】:Stop condition for printing linked structs?打印链接结构的停止条件?
【发布时间】:2010-02-02 15:58:31
【问题描述】:

我有以下结构:

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 see what I'm trying to do */
    if (&l != 0x000000) {
        printf("%d \t", l->nmbr);
        write(l->p);
    }
}

【问题讨论】:

  • 为什么在这种情况下使用递归? while 循环的执行速度可能比每个项目的函数调用开销快得多。在您的情况下,性能很重要吗?

标签: c recursion struct pointers


【解决方案1】:

你想要

if (l != 0)

if (l != NULL)

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

【讨论】:

    【解决方案2】:

    假设 NULL 中的链表终止,您应该检查 'l' 不是 NULL 而不是 '&l'。

    【讨论】:

      【解决方案3】:

      假设链表不是循环的,当你到达一个空指针时你就停下来。 改变

      if (&l != 0x000000)
      

      if (l != NULL)
      

      【讨论】:

        【解决方案4】:

        正如其他人所说,您应该检查 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;
          }
        

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

          • 这是因为l是指针,需要查看指针值是否为null,而不是指针值的指针。
          • 这不处理 write() 直接传递 NULL 而不是递归调用的情况。
          • 除了可能发生的唯一方法是用户直接使用 null 调用它。即使打印在 if 用户可以简单地传递一个错误的非空引用,所以它并不能真正使程序更安全。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-30
          • 2018-01-11
          相关资源
          最近更新 更多