taozhenJ 2024-08-23 08:22 采纳率: 78.9%
浏览 4
已结题

链表求最大公约数(C++)


int gcd(int a, int b)
{
    if(b == 0) return a;
    return gcd(b, a % b);
}

ListNode *insert(ListNode* head) 
{
    ListNode *p = head;
    while(p != nullptr) 
    {
        ListNode *node = new ListNode(gcd(p->val, p->next->val));
        node->next = p->next;
        p->next = node;
        p = node->next;
    }
    return head;
}

Segmentation Fault了!

  • 写回答

1条回答 默认 最新

  • 阿里小阿希 2024-08-23 09:11
    关注

    访问空指针:当p指向链表的最后一个节点时,p->next将是nullptr。此时,调用gcd(p->val, p->next->val)会导致解引用空指针,从而引发段错误。解决方案:在调用gcd之前,确保p->next不是nullptr。

    ListNode *insert(ListNode* head) 
    {
        if (head == nullptr) return nullptr; // 处理空链表的情况
    
        ListNode *p = head;
        while(p->next != nullptr) // 确保不会在最后一个节点处调用gcd
        {
            int val = gcd(p->val, p->next->val);
            ListNode *node = new ListNode(val);
            if (node == nullptr) {
                // 处理内存分配失败的情况
                // 这里可以添加错误处理逻辑,例如释放已分配的内存,返回错误代码等
                return nullptr;
            }
            node->next = p->next;
            p->next = node;
            p = node->next;
        }
        return head;
    }
    
    
    

    如果修改后的代码仍然出现段错误,那么可能需要更详细的信息来定位问题。您可以使用调试工具(如gdb或valgrind)来获取调用栈信息,查看在哪个具体的操作步骤中发生了段错误。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 9月8日
  • 已采纳回答 8月31日
  • 创建了问题 8月23日