【问题标题】:Can't keep linkedlist print function from crashing无法防止链表打印功能崩溃
【发布时间】:2012-10-10 06:56:02
【问题描述】:

我有高级语言方面的经验,但我是 C 新手。我得到了一个单链表的实现。每次我尝试遍历列表时,我都会内存不足(至少我认为这是正在发生的事情)。下面是列表的实现:

/*Vertex data type.*/
typedef struct vnode {
   struct vnode *NEXT;
   int DATA;
      } VertexBody;
typedef VertexBody *TypeVertex;

/*List data type (no header, just a pointer to first item).*/
typedef TypeVertex TypeList;

这是我的打印功能:

void print_list(TypeList *L) {
    TypeVertex v=*L;
    while(NEXT(v)!=NULL) {
        printf("%d\n", DATA(v));
        v=NEXT(v);
    }
    printf("%d\n", DATA(v));
}

运行 print_list 给出以下输出(假设列表包含 3 个顶点,数据分别设置为 1、2、3):

1
2
3
-94064

然后程序崩溃。有什么问题?

编辑:在第一段中将“遍历”更改为“遍历”。

【问题讨论】:

  • 看起来你没有在构造时初始化NEXT指向NULL的指针。
  • @DanielFischer 那么简单地在 C 中声明某些内容不会将其设置为 NULL 吗?这可以解释很多。
  • 不,一般来说不是。如果没有显式初始化,则具有静态存储持续时间的对象被隐式初始化为 0,自动的东西(局部变量)不是。

标签: c linked-list loops


【解决方案1】:

似乎我错误地识别了这个问题。程序崩溃了,因为我忘记为列表分配内存。我觉得自己像个白痴,但至少我可以继续前进。谢谢你的回答。

【讨论】:

    【解决方案2】:

    在遍历链表时,您要确保当前 项不是NULL。确认后,您想将其打印出来,然后获取下一个。

    因此,这段代码:

    void print_list(TypeList *L) {
        TypeVertex v=*L;
        while(NEXT(v)!=NULL) {
            printf("%d\n", DATA(v));
            v=NEXT(v);
        }
        printf("%d\n", DATA(v));
    }
    

    应该是:

    void print_list(TypeList *L) {
        TypeVertex v=*L;
        while(v!=NULL) {
            printf("%d\n", DATA(v));
            v=NEXT(v);
        }
        printf("%d\n", DATA(v));
    }
    

    【讨论】:

    • 这是一个错误。但这不会导致非空列表崩溃。它将打印链接列表中除最后一个元素之外的所有元素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多