段错误 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;
...
您应该花一个小时左右的时间来学习调试器的基础知识。使用调试器,您可以在几分钟内找到此类问题。
免责声明:我不确定程序应该做什么,可能还有其他问题。
我必须在 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;
...
您应该花一个小时左右的时间来学习调试器的基础知识。使用调试器,您可以在几分钟内找到此类问题。
免责声明:我不确定程序应该做什么,可能还有其他问题。