0

我有以下结构:

struct coords
{
    int x;
    int y;
    struct coords* previous;
    struct coords* next;
};

然后我有一个这些坐标的双向链表(格式为 (x,y)),它应该看起来像这样(其中 head 和 tail 是列表的开始和结束):

head                                                          tail
(-1, -1) <--> (0, 1) <--> (2, 1) <--> (1, 0) <--> (0, 2) <--> (-1, -1)

我想打印这个列表,所以我有以下代码:

struct coords* iter = head;
while (iter->next != NULL)
      {
          printf("\n [this node: (%d, %d)] -> [next node: (%d), (%d)]", iter->x, iter->y, iter->next->x, iter->next->y);
          iter = iter->next;
      }
printf("done with loop");

我得到的输出是这样的:

[this node: (-1, -1)] -> [next node: (0, 1)]
[this node: (0, 1)] -> [next node: (2, 1)]
[this node: (2, 1)] -> [next node: (1, 0)]
[this node: (1, 0)] -> [next node: (0, 2)]
[this node: (0, 2)] -> [next node: (-1, -1)]

这是正确的。但是,在打印最后一行后,我的程序立即崩溃而没有打印“循环完成”。

4

2 回答 2

1

你确定 tail->next 的值是 NULL 吗?

如果不是,这就是原因!

于 2013-06-20T05:36:48.853 回答
0

你是如何将节点插入到列表中的?-1, -1 节点上的下一个指针很可能不为空。因为它不是 null,所以 null 检查通过,但是当您尝试调用 iter->next->x 时,->x 取消引用虚假内存并且您的程序崩溃。检查的简单方法是打印下一个指针。

printf("\n [this node: (%d, %d)] -> [next node: (%d), (%d)], next next= %p", iter->x, iter->y, iter->next->x, iter->next->y, iter->next->next);

它应该是非空的,除了打印的最后一行,在这种情况下它应该是空的。

大多数插入代码都会传播初始的 head 值,所以我猜你在声明它时可能没有将你的 head 指针初始化为 null 。

于 2013-06-20T04:39:25.987 回答