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

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

Извините, 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;
}

3 ответа

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

 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;

}

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

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

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

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

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

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';
Другие вопросы по тегам