2013-06-20 54 views
0

我有以下结构:崩溃印刷链表

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

我再有这些COORDS的双向链表(格式为(X,Y)),这应该是这样的(其中头尾巴开始和列表的末尾):

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)] 

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

+1

你确定最后一项有'next'设置为null吗? – John3136

+0

一个非常简单的解决方案。我不知何故忽略了这一点。谢谢。 – blacktrance

回答

1

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

如果不是,那就是原因!

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); 

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

大多数插入代码传播的初始头值,所以我想你可能没有初始化你的头指针为null当你声明它。