2013-08-20 121 views
0

我有此代碼以打印鏈表[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

+1

什麼被印刷所以? – nouney

+1

在您的第二個代碼中,您正在執行'NULL-> data'?你懂嗎? –

回答

1

你可能想改變這種

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

成爲

ptr=ptr->next; 
if (NULL != ptr) 
    printf("%d--->",ptr->data); 

最後一次迭代程序試圖取消引用NULL,這會導致不確定的行爲而這又最propably使得程序然後崩潰。

並且由於stdout是行緩衝,所以填充了1-->2-->2-->3的緩衝區將不會被刷新並打印出來。


你可能有機會通過每次調用print()後加入

flush(stdout); 

重現此。

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,但在ptr的賦值之後,您正在執行printf("%d--->",ptr->data);。這就像:printf("%d--->",NULL->data);這會導致未定義的行爲(您可能會遇到分段錯誤)。

1

與第二個代碼,你會得到一個分段錯誤。

因爲在這個代碼

ptr=ptr->next; 

其中ptr->nextNULL,然後ptrNULL,然後執行

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

ptr = NULL會引起分割故障

+0

不要直接說分段錯誤更好說未定義的行爲(可能是在運行時出現分段錯誤) –