2017-05-24 107 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

谢谢,我在这里理解了这个问题 –