我有这个代码来打印链接列表[1,2,3]
void reverse(struct node *ptr){
head = ptr;
while(ptr!=NULL){
printf("%d--->",ptr->data);
ptr=ptr->next;
}
}
输出 1 - →2 - →3
我正在尝试打印ptr(当前节点)的下一个元素,如
void reverse(struct node *ptr){
head = ptr;
while(ptr!=NULL){
printf("%d--->",ptr->data);
ptr=ptr->next;
printf("%d--->",ptr->data);
}
}
为什么不打印 1 - > 2 - > 2 - > 3 - > 3 ?
答案 0 :(得分:1)
您可能想要更改此
ptr=ptr->next;
printf("%d--->",ptr->data);
成为
ptr=ptr->next;
if (NULL != ptr)
printf("%d--->",ptr->data);
对于最后一次迭代,程序尝试取消引用NULL
,这会导致未定义的行为,这反过来最可能使程序崩溃。
当stdout
行缓冲时,填充1-->2-->2-->3
的缓冲区将不会被刷新并打印出来。
您可能有机会通过添加
来重现这一点flush(stdout);
每次致电print()
后。
答案 1 :(得分:1)
void reverse(struct node *ptr){
head = ptr;
while(ptr!=NULL){
printf("%d--->",ptr->data);
ptr=ptr->next;
if (ptr)
printf("%d--->",ptr->data);
}
}
试试这段代码。问题是ptr在循环期间的某个时刻将等于NULL
,但是在printf("%d--->",ptr->data);
的分配之后你正在进行ptr
。它类似于:printf("%d--->",NULL->data);
导致未定义的行为(您可能会遇到分段错误)。
答案 2 :(得分:1)
使用第二个代码,您将获得分段错误。
因为在此代码中
ptr=ptr->next;
其中ptr->next
为NULL
,ptr
为NULL
,然后执行
printf("%d--->",ptr->data);
ptr
= NULL
会导致细分错误