【问题标题】:Segmentation fault while finding middle element in a linked list在链表中查找中间元素时出现分段错误
【发布时间】:2017-05-24 18:30:05
【问题描述】:

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

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

请帮忙。

【问题讨论】:

  • 缺少push的实现
  • 如果fast->nextNULLfast->next->next; 将失败。
  • 以后如果在调试器中运行程序,看看是哪一行使程序崩溃,会省去很多麻烦。另一个好方法是添加assert() 语句,表明您正在执行的操作确实有效。在这里,可能包括assert(head_ref);assert(slow);
  • @xsami 我在这里暂时发表了评论,以添加信息(快速),我也将其编辑到问题中(我必须等待同行评审)。它本应以实事求是的方式进行,但必须对“小”编辑进行彻底的推理以确保其被接受。无需为小事故道歉——这不是我想要达到的目标。

标签: c pointers linked-list segmentation-fault


【解决方案1】:

你的问题是:

fast = fast->next->next;

假设链表中有两个元素:A -> B -> NULL,首先执行fast = fast->next,这会导致快速指向B 节点。

进入while循环时,尝试获取B->next->next,结果是NULL->next,显然不存在。

实现是完全错误的,您应该确保避免这种情况。 while 可以改为:

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

这会解决它。

请记住,如果有一对元素,您总是会得到中间的一个,它更左。所以在A -> B -> NULL 你会得到节点A

【讨论】:

  • 谢谢,我明白了这里的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 2020-01-02
  • 2020-08-08
  • 1970-01-01
  • 2015-05-18
相关资源
最近更新 更多