在链表中查找中间元素时出现分段错误

时间:2017-05-24 18:30:06

标签: c pointers linked-list segmentation-fault

我正在尝试找到链接列表的中间元素,但是我遇到了分段错误,我不确定会出现什么问题。这是我对野兔算法的实现:

//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;  
}

请帮忙。

1 个答案:

答案 0 :(得分:0)

你的问题在于:

$args = array(
    'status'        => null,
    'customer_id'   => null,
    'customer_note' => null,
    'parent'        => null,
    'created_via'   => null,
    'cart_hash'     => null,
    'order_id'      => 0,
);

想象一下,链接列表中有两个元素:fast = fast->next->next; ,首先执行A -> B -> NULL,这会导致快速指向fast = fast->next节点。

当您输入while循环时,您会尝试获取B,这会产生B->next->next,这显然不存在。

实施是完全错误的,你应该确保避免这种情况。时间可以改为:

NULL->next

这会解决它。

请记住,如果有一对元素,你总会得到更左边的中间元素。因此,在while(fast!=NULL && fast->next != NULL) 中,您将获得节点A -> B -> NULL