2015-10-11 73 views
-4

我做的Hackerrank一個問題的最終到達,但每當我編譯我的代碼,它顯示了控制到達非void函數結束。這裏是我的源代碼:控制在非void函數

/* 
Compare two linked lists A and B 
Return 1 if they are identical and 0 if they are not. 
Node is defined as 
struct Node 
{ 
int data; 
struct Node *next; 
} 
*/ 
int CompareLists(Node *headA, Node* headB) 
{ 

if(headA==NULL&&headB==NULL) 
{ 
    return 1; 
} 
else if(headA!=NULL&&headB!=NULL) 
{ 
    while(headA!=NULL&&headB!=NULL) 
    { 
     if(headA->data==headB->data) 
      { 
      headA=headA->next; 
      headB=headB->next; 
      } 
     else 
      { 
      return 0; 
      exit (0); 
     } 
     return 1; 
    } 
} 
else 
    { 
    return 0; 
} 
} 

請告訴如何糾正這一點,並提前致謝。

+0

如果您修復縮進,它可能會幫助您查看發生了什麼問題。 – Galik

回答

0

該代碼執行後會發生什麼?

if(headA->data==headB->data) 
{ 
    headA=headA->next; 
    headB=headB->next; 
} 

...如果headA->next == NULLheadB->next == NULL

2

我可以在這裏看到兩個可達性問題。首先是簡單的:

{ 
     return 0; 
     exit (0); 
    } 

exit呼叫無法到達。 (這條線幾乎可以肯定是一個錯誤,我想不出什麼好理由罵exit那裏。)

下一個更復雜的一個...這是編譯錯誤的根本原因:

while(headA!=NULL&&headB!=NULL) 
    { 
     if(headA->data==headB->data) 
      { 
      headA=headA->next; 
      headB=headB->next; 
      } 
     else 
      { 
      return 0; 
      exit (0); 
     } 
     return 1; 
    } 

看看return 1;在哪裏。它是內部循環。

那麼,如果headA != NULL && headB != NULL評估爲false會發生什麼?在這種情況下,跳過末尾return 1;的循環體,並且您到達該方法的結尾。

因此編譯錯誤。

我懷疑「修復」是將return移到循環之後,但我沒有試圖理解你的代碼的邏輯,所以這可能是錯誤的「修復」。

相關問題