2015-10-11 44 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移到循环之后,但我没有试图理解你的代码的逻辑,所以这可能是错误的“修复”。

相关问题