троичное дерево дает ошибку

Это простая троичная древовидная структура. Я правильно написал код, но через некоторое время он говорит:

Извините, ternary.exe перестал работать.

Можете ли вы сказать мне причину этой ошибки.

#include<iostream>
#include<string>
using namespace std;
struct tnode{
int data[2];
tnode *ptr[3];
};

void swap(int *a,int *b){
int t;
t=*a;
*a=*b;
*b=t;
}
//for initializing tnode variables as null or null character
void newtree(tnode *&T){
T->data[0]='\0';
T->data[1]='\0';
T->ptr[0]=NULL;
T->ptr[1]=NULL;
T->ptr[2]=NULL;
}

void fillto(tnode *&T,int a){

if(T->data[0]=='\0'){
T->data[0]=a;
}
else if(T->data[0]!='\0'&&T->data[1]=='\0'){
T->data[1]=a;
if(T->data[0]>T->data[1])
swap(T->data[0],T->data[1]);
}
else{
if(a<T->data[0]){

if(T->ptr[0]==NULL){
T->ptr[0]=new(tnode);
newtree(T->ptr[0]);
}

fillto(T->ptr[0],a);
}
else if(a>T->data[1]){
if(T->ptr[2]==NULL){
T->ptr[2]=new(tnode);
newtree(T->ptr[2]);
}
fillto(T->ptr[2],a);
}
else{

if(T->ptr[1]==NULL){
newtree(T->ptr[1]);
T->ptr[1]=new(tnode);
}
fillto(T->ptr[1],a);
}
}
}

tnode *datatnode(string s){
int l=0;
tnode *T;
tnode *E;
T=new(tnode);
char c[0];
newtree(T);
E=T;

while(l<=s.length()){
c[0]=s[l];
cout<<atoi(c)<<endl;
fillto(T,atoi(c));
l++;
}
return E;

}int main(){
string s="5398124";
tnode *T;
T=new(tnode);
T=datatnode(s);
cout<<T->data[0];
return 0;
}

1

Решение

Вы должны удалить знак «=», как показано ниже

 tnode *datatnode(string s){
int l=0;
tnode *T;
tnode *E;
T=new(tnode);
char c;
newtree(T);
E=T;
int a = s.length();
while(l<a){
c=s[l];
cout<<atoi(&c)<<endl;
fillto(T,atoi(&c));
l++;
}
return E;

}
1

Другие решения

Трудно сказать из вашего кода (так как мысленно вы должны запустить его в своей голове). Лучше отладить это. Вызвать некоторую отладку в ключевых точках вашего кода и попытаться найти точную строку кода …. это может привести к большой отладке в зависимости от размера вашего набора данных.

В предположении я бы сказал, что вы, вероятно, нажали неверный адрес или что-то в этом роде, поэтому программы обычно умирают неожиданно и сразу! Поэтому я бы посоветовал быть очень безопасным при проверке указателей. Например:

void fillto(tnode *&T,int a){

if (T != NULL){

if(T->data[0]=='\0')
{
T->data[0]=a;
}

:
:

}
else
{
printf("Warning: NULL pointer!\n");
}

}

По сути, всякий раз, когда вы используете указатель, который передается в функцию, вы должны проверить, что он не равен нулю. Как правило, это хорошая практика кода и может помочь вам найти ваши ошибки 🙂

Также инициализация int может быть просто:

int i = 0;

вместо

int i = '\0';
0

Основной недостаток, который вызывает ошибку, заключается в ‘void fillto (tnode *&T, int a) ‘функция:

...
if(T->ptr[1]==NULL){
newtree(T->ptr[1]);
...
}

Поскольку функция newtree не проверяет, равен ли указатель нулю, вы в конечном итоге разыменовываете нулевой указатель в newtree.

0
По вопросам рекламы [email protected]