c++ - 为什么此代码会出现段错误?

标签 c++ segmentation-fault

我正在实现以下算法:

1.创建一个空队列。

2.将链表的第一个节点作为根,入队到队列中。

3.直到我们到达列表的末尾,执行以下操作。

  • 从队列中取出一个节点。这是当前的父级。

  • 遍历列表中的两个节点,将它们添加为当前父节点的子节点。

  • 将两个节点入队。


#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <queue>
using namespace std;

struct Node{
    int data;
    struct Node* next;
};

typedef struct Node* NODE;

NODE createNode(int data){
    NODE newNode = (NODE) malloc (sizeof(struct Node));
    newNode->data = data;
    newNode->next = NULL;
    return (newNode);
}

void insertAtEnd(NODE* head, int data){
    NODE newNode = createNode(data);
    if(*head == NULL){
        *head = newNode;
        return ;
    }

    NODE temp = *head;
    while(temp->next){
        temp = temp->next;
    }
    temp->next = newNode;
    newNode->next = NULL;
    return;
}


struct tree_node{
    int data;
    struct tree_node* left;
    struct tree_node* right;
};

typedef struct tree_node* T_NODE;

T_NODE createTreeNode(int data){
    T_NODE newNode = new tree_node;
    newNode->right = NULL;
    newNode->left = NULL;
    newNode->data = data;
    return newNode;
}

void inorderTraversal(){}


T_NODE convertListIntoCBT(NODE head){


    T_NODE root;

    if(head){
        queue<T_NODE>q;
        root=createTreeNode(head->data);

        if(!root){
            cout << "Error creating root"<<endl;
            exit(-1);
        }
        q.push(root);

        T_NODE temp=NULL , parent=NULL;
        while(head->next){
            temp = q.front();
            q.pop();
            parent = temp;
            head = head->next;
            parent->left = createTreeNode(head->data);
            q.push(parent->left);
            head = head->next;
            parent->right = createTreeNode(head->data);
            q.push(parent->right);
        }

        return root;
    }
}

int main(){

    NODE head = NULL;
    insertAtEnd(&head,36);
    insertAtEnd(&head,30);
    insertAtEnd(&head,25);
    insertAtEnd(&head,15);
    insertAtEnd(&head,12);
    insertAtEnd(&head,10);

    //convert the given linked list into complete binary tree
    T_NODE new_root = convertListIntoCBT(head);

    return 0;
}

我尝试使用 gdb 进行调试,结果如下:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400e5a in convertListIntoCBT(Node*) ()
(gdb) backtrace
0  0x0000000000400e5a in convertListIntoCBT(Node*) ()
1  0x0000000000400fa2 in main ()
(gdb) 

我无法理解为什么我会在函数开头遇到段错误!?

最佳答案

您的 while(head->next) 循环中似乎缺少一些检查。我认为您应该检查 next 和 next-to-next,因为您在循环中同时使用了两者:

while(head->next && head->next->next)
{
    //...
}

或者可能在循环内第二次前进之前再次检查:

    while(head->next){
        temp = q.front();
        q.pop();
        parent = temp;
        head = head->next;
        parent->left = createTreeNode(head->data);
        q.push(parent->left);

        if(head->next) // <-- check again here
        {
            head = head->next;
            parent->right = createTreeNode(head->data);
            q.push(parent->right);
        }
    }

另外正如评论中所建议的那样,不要将 C 风格与 C++ 风格混合,选择一种语言并尝试坚持使用它。我在这里谈论的是使用 malloctypedef struct,尽管它们可以编译,但它们不是“普通的”C++。

关于c++ - 为什么此代码会出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42592346/

相关文章:

c++ - 如果 std::string 从未修改过,它可以在创建后移动吗?

ios - EXC_BAD_ACCESS(SIGSEGV)和AVAudioSession

c++ - 当我写入超出数组末尾时,为什么不会出现段错误?

c++ - 实例化结构时出现段错误 - C++

c - 打印期间出现段错误,包括大型数组计算

c++ - 是否可以获得内置标准运算符的函数指针?

c++ - <functional> 中奇怪的模板语法

c++ - 为什么我不能将 unique_ptr 推回 vector 中?

c - 将节点添加到链表时出现段错误

c++ - 如何使用Qt获取wifi信号强度?