首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分段故障链表合并排序

分段故障链表合并排序
EN

Stack Overflow用户
提问于 2021-07-06 18:36:11
回答 2查看 43关注 0票数 0

我正在尝试使用合并排序对链表进行排序,但每次我遇到分段错误时,我从2天开始就一直在努力尝试,并多次运行调试器,请帮帮忙。我遵循了将链表分成两部分并递归调用merge sort的方法。

代码语言:javascript
复制
void merge_sort(Node**head){
    if((*head)->next == NULL){
        return ;
    }
    Node *a , *b ;
    FrontBackSplit( *head, &a, &b);
    merge_sort(&a);
    merge_sort(&b);
    *head = merge(a,b);
}
Node *merge(Node *a , Node*b){
    Node *result = NULL ;
    if(a == NULL){
        return b;
    }
    else if(b == NULL){
        return a;
    }
        if(a->data <= b->data){
            result = a;
            result->next = merge(a ->next,b) ;
        }
        else {
            result = b; 
            result->next = merge(a , b->next) ;
        }
    
    return result ;
}

void FrontBackSplit(Node* source,
                    Node** frontRef, Node** backRef)
{
    Node* fast;
    Node* slow;
    slow = source;
    fast = source->next;
 
    /* Advance 'fast' two nodes, and advance 'slow' one node */
    while (fast != NULL) {
        fast = fast->next;
        if (fast != NULL) {
            slow = slow->next;
            fast = fast->next;
        }
    }
 
    /* 'slow' is before the midpoint in the list, so split it in two
    at that point. */
    *frontRef = source;
    *backRef = slow->next;
    slow->next = NULL;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-06 18:49:34

您还应该考虑头指针本身指向null的情况(如果长度为0)(而不仅仅是"head -> next“指针)。然后你的第一个if会是这样的:

代码语言:javascript
复制
void merge_sort(Node**head){
if((*head)->next == NULL || (*head) == NULL ){
    return ;
}
Node *a , *b ;
FrontBackSplit( *head, &a, &b);
merge_sort(&a);
merge_sort(&b);
*head = merge(a,b);

}`

票数 1
EN

Stack Overflow用户

发布于 2021-07-06 18:45:54

您需要进行更多的调试,但是如果ab都成为merge()方法中的NULL,那么您的代码将会产生分段错误。

这是因为当ab都是NULL时,你将返回NULL,然后你的*head变成NULL,任何像(*head)->next这样的访问都会产生分段错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68268992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档