2017-05-24 51 views
0

我試圖找到鏈接列表的中間元素,但我遇到了分段錯誤,並且我不確定發生了什麼問題。這是我實施的兔子算法:在鏈接列表中查找中間元素時出現分段錯誤

//fast slow pointer method 
void ptMiddle(struct node **head_ref) 
{ 
    struct node *fast = (*head_ref); 
    struct node *slow = (*head_ref); 
    fast = fast->next; 

    while(fast!=NULL) 
    { 
     // printf("%d%d",slow->data,fast->data); 
     slow = slow->next; 
     fast = fast->next->next; 
    } 
    printf("Middle elemnet is:%d\n",slow->data); 
} 

int main() 
{ 
    struct node * head=NULL; 
    push(&head,1); 
    push(&head,2); 
    push(&head,3); 
    push(&head,4); 
    printList(&head); 
    printf("M:%d\n",middleNode(&head)->data); 
    printf("here"); 
    append(&head,5); 
    append(&head,6); 
    printList(&head); 
    printf("M:%d\n",middleNode(&head)->data); 
    printf("here"); 
    ptMiddle(&head); 

    return 0; 
} 

請幫忙。

+2

'push'的執行缺失 – RoiHatam

+3

'fast-> next-> next;'如果'fast-> next'爲'NULL'將會失敗。 –

+0

提供[mcve]。 – BLUEPIXY

回答

0

您的問題是在該行:

fast = fast->next->next; 

假設您在鏈表兩個元素:A -> B -> NULL,首先你通過執行fast = fast->next,這將導致快速指向B節點開始。

當您輸入while循環時,您嘗試獲得B->next->next,這會導致NULL->next,這顯然不存在。

執行是明顯錯誤的,你應該確保避免這種情況。雖然可以改爲:

while(fast!=NULL && fast->next != NULL) 

這將解決它。

請記住,如果配對數量的元素,你總是會得到更多的中間一個。所以在A -> B -> NULL你會得到節點A

+0

謝謝,我在這裏理解了這個問題 –