打印链表的当前节点的下一个元素

时间:2013-08-20 19:15:25

标签: c data-structures

我有这个代码来打印链接列表[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

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->nextNULLptrNULL,然后执行

printf("%d--->",ptr->data);

ptr = NULL会导致细分错误