当前位置: 首页 > 知识库问答 >
问题:

为什么使用此函数进行合并排序(使用链接列表)时会出现堆栈溢出错误?

阙新觉
2023-03-14

我使用mid_element()函数返回中间节点的地址,并使用Merge()函数合并两个排序的链接列表。这两个函数都工作正常。但是为了以防万一,我附加了代码。我经历了合并排序算法,该算法将链表分为两部分,一个包含第一个节点直到中间节点,另一个包含从中间1到结束的节点。当然,中间节点的下一个指针设置为 null。然后,我们在两半上递归地调用合并排序,最后将两者合并。我做了同样的事情,但我最终遇到了堆栈溢出错误。请帮忙。中间元件功能:

Node *mid_element(Node *head)
{
    if(head==NULL || head->next==NULL)
        return head;
    Node *slow=head,*fast=head->next;
    while(fast!=NULL)
    {
        if(fast->next==NULL)
        {
            slow=slow->next;
            break;
        }
        else
        {
            fast=fast->next->next;
            slow=slow->next;
        }
    }
    return slow;
}

合并功能:

Node *Merge(Node *h1,Node *h2)
{
    Node *h=h1->data<h2->data?h1:h2,*t=h;
    h1=h1->next;
    while(h1!=NULL && h2!=NULL)
    {
        if(h1->data<h2->data)
        {
            t->next=h1;
            t=t->next;
            h1=h1->next;
        }
        else
        {
            t->next=h2;
            t=t->next;
            h2=h2->next;
        }
    }
    if(h1!=NULL)
        t->next=h1;
    if(h2!=NULL)
        t->next=h2;
    return h;
}

合并排序功能:

Node *MergeSort(Node *head)
{
    if(head==NULL || head->next==NULL)
        return head;
    else
    {
        Node *mid=mid_element(head);
        Node *temp=mid->next;
        mid->next=NULL;
        Node *res1=MergeSort(head);
        Node *res2=MergeSort(temp);
        Node *res=Merge(res1,res2);
        return res;
    }
}

节点的定义:

class Node
{
public:
    int data;
    Node *next;

    Node(int data)
    {
        this->data=data;
        next=NULL;
    }

};

我正在使用一个函数来获取输入。用户输入空格分隔的数字列表,其中-1表示列表结束。输入功能

Node *takeInput()
{
    int data;
    Node *head=NULL,*temp=NULL,*curr=NULL;
    do{
        cin >> data;
        if(data!=-1)
        {
            temp=new Node(data);
            if(head==NULL)
            {
                head=curr=temp;
            }
            else
            {
                curr->next=temp;
                curr=curr->next;
            }

        }
    }while (data!=-1);
    return head;
}

关于列表的大小,我刚刚检查了只有5-6个元素的列表,它崩溃了。

共有1个答案

沈思博
2023-03-14

Merge()中的此行取消引用可能为空的指针。

Node *h=h1->data<h2->data?h1:h2,*t=h;

它可能为空,因为mid_element()包含此行

if(head==NULL || head->next==NULL)
    return head;

…它可以返回一个next元素为null的指针,并且MergeSort()接受该返回值,获取可能为null的next元素,并将其传递给Merge()

底线:在取消引用指针之前,需要进行更多的空检查。

 类似资料:
  • 问题内容: 下面的代码在执行时会产生堆栈溢出错误。但是,如果删除其中一个 它运行时没有堆栈溢出错误。如果我有以上两行,而类中只有其中一行,则没有错误,怎么会出现堆栈溢出错误呢? 问题答案: 两者都需要生成一个。当包含此行时: 首次访问该类时,将创建的实例。 不包括此行: 一切都很好。但是这条线很关键。每次创建的实例时,它都会尝试初始化其成员变量-另一个对象。然后, 该 实例将 其 初始化为另一个对

  • 我一直在尝试使用Gson将EMF(Eclipse建模框架)模型对象序列化到Json。然而,我遇到了堆栈溢出错误,当类的包含属性设置为true时,这种错误似乎会发生。他们在EMF模型上使用GSON有任何已知的限制吗? 下面链接的是我尝试序列化的(相当简单的)EMF 模型。请注意,如果我将 Chip 中“子块”的包含属性设为 false(在这种情况下,JSON 会正确生成),则不会发生错误: 我的EM

  • 我有一个执行快速排序的应用程序。在我开始给它一些更大的数字(我第一次得到它是10000000)之前,它工作得很好。我知道是由递归引起的,但我不明白为什么我的应用程序会因此而崩溃。如有任何建议,将不胜感激。这是我的密码:

  • 问题内容: 我目前正在用Java编写一种快速排序算法,以对整数的随机数组进行排序,然后使用System.nanoTime()对它们进行计时。这些数组的大小是10的幂,从10 ^ 3到10 ^ 7结束。此外,随机列表具有不同的属性。我正在对纯随机列表进行排序,具有一些相同值的列表(fewUnique),反向排序的列表,已排序的列表和几乎已排序的列表。 排序有效。它对数组进行递归快速排序,直到需要对数

  • 问题内容: 我的第一段代码是我的项目对象文件;第二个是主班。在运行代码没有任何问题之前,但是在添加读写文件之后,我的代码开始收到堆栈流错误。只是正在调用错误的代码段。 我的主班: 如何找到导致堆栈溢出的地方? 问题答案: 创建: 并创造 因此,在初始化时,您将不断创建这些对象 有一个类似的Baeldung示例,用于获取StackOverflowError 由于ClassOne的构造函数实例化了Cl