段错误 11 二叉树路径

Segfault 11 binary tree paths

我必须在 C++ 中创建一个函数来查找 外部路径 内部路径 的二叉树并打印出来。一旦调用查找路径的函数,我就遇到了段错误 11 的问题,但我无法弄清楚段错误在哪里。我对什么是段错误不是很清楚,我所知道的是该程序正在尝试访问一块不可用的内存。谢谢你的时间。

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

class Nodo
{   
    friend class Albero;
    Nodo (int);
    int valore;
    Nodo *prev;
    Nodo *next;
};

Nodo :: Nodo (int num)
{
    valore = num;
    prev = 0;
    next = 0;
};

class Albero
{
    public:
        Albero ();
        void inserisci (int);     // insertion of a value;
        void trovaCammino (int&, int&, int);    // find path
        void stampa ();        //print
    private:
        Nodo *radice;          // first item
        void stampaRicorsivo (Nodo*);
        void inserisciRicorsivo (Nodo *&, int);
        void trovaCamminoRic (Nodo*&, int&, int&, int);
};

Albero :: Albero ()
{
    radice = 0;
};

void Albero :: inserisci (int nuovo)
{
    inserisciRicorsivo (radice, nuovo);
};

void Albero :: inserisciRicorsivo (Nodo*& radice, int nuovo)
{
    if (radice == 0)
    {
        radice = new Nodo (nuovo);
    } else if (nuovo < radice->valore)
        {
            inserisciRicorsivo(radice->prev, nuovo);
        } else if (nuovo > radice->valore)
            {
                inserisciRicorsivo(radice->next, nuovo);
            }
};

void Albero :: trovaCammino (int& contInt, int& contEst, int curr)
{
    trovaCamminoRic(radice, contInt, contEst, curr);
};

void Albero :: trovaCamminoRic (Nodo*& radice, int& contInt, int& contEst, int curr)
{
    if (radice->prev != 0)              // if previous element is present
    {
        curr++;                         // increase current level
        contInt++;                      // increase internal path counter
        trovaCamminoRic(radice->prev, contInt, contEst, curr);          // call it again on the previous element
    } else if (radice->next != 0)       // if next element is present...
    {
        curr++;
        contInt++;
        trovaCamminoRic(radice->prev, contInt, contEst, curr);
    } else              // if both are untrue, which means that the node is a leaf
    {
        contEst = (contEst+curr);       // increase the external counter
        contInt--;                      // decrease the internal counter by one;
    }
};

void Albero :: stampa ()
{
    stampaRicorsivo (radice);
};

void Albero :: stampaRicorsivo (Nodo* radice)
{
    if (radice != 0)
    {
        stampaRicorsivo (radice->prev);
        cout << radice->valore << endl;
        stampaRicorsivo(radice->next);
    }
;}

int main ()
{
    int curr;
    curr = 0;
    Albero rami;
    int dim;
    cout << "Inserire la grandezza dell'albero che si vuole generare"; cin >> dim;
    for (int i = 0; i < dim; i++)
    {
        int num; 
        cout << "Inserire il valore n° " << (i+1) << ": "; cin >> num;
        rami.inserisci(num);
    }
    int contInt = 0;
    int contEst = 0;
    rami.stampa();
    rami.trovaCammino(contInt, contEst, curr);
    cout << "Il cammino interno dell'albero è: " << contInt << endl << "Il cammino esterno dell'albero è: " << contEst << endl;
}

trovaCamminoRic 中,radice 可以为 NULL,但您不检查它,并且像 radice->prev 中那样取消引用 NULL 是未定义的行为,这通常会使您的程序崩溃段错误。

只需添加此检查,它就会起作用:

void Albero::trovaCamminoRic(Nodo*& radice, int& contInt, int& contEst, int curr)
{
  if (radice == NULL)
    return;
  ...

您应该花一个小时左右的时间来学习调试器的基础知识。使用调试器,您可以在几分钟内找到此类问题。

免责声明:我不确定程序应该做什么,可能还有其他问题。