C++ 三元树给定误差

C++ 三元树给定误差,c++,data-structures,tree,ternary-tree,C++,Data Structures,Tree,Ternary Tree,这是简单的三元树结构。我已经正确地编写了代码,但在运行时,它会在一段时间后显示: 抱歉,Trialum.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; *

这是简单的三元树结构。我已经正确地编写了代码,但在运行时,它会在一段时间后显示:

抱歉,Trialum.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;
}
#包括
#包括
使用名称空间std;
结构节点{
int数据[2];
tnode*ptr[3];
};
无效交换(int*a,int*b){
int t;
t=*a;
*a=*b;
*b=t;
}
//用于将tnode变量初始化为null或null字符
无效新树(T节点*&T){
T->data[0]='\0';
T->data[1]='\0';
T->ptr[0]=NULL;
T->ptr[1]=NULL;
T->ptr[2]=NULL;
}
无效填充(T节点*&T,内部a){
如果(T->data[0]='\0'){
T->data[0]=a;
}
否则如果(T->data[0]!='\0'&&T->data[1]='\0'){
T->data[1]=a;
如果(T->data[0]>T->data[1])
交换(T->数据[0],T->数据[1]);
}
否则{
if(adata[0]){
如果(T->ptr[0]==NULL){
T->ptr[0]=新(tnode);
newtree(T->ptr[0]);
}
fillto(T->ptr[0],a);
}
否则,如果(a>T->数据[1]){
如果(T->ptr[2]==NULL){
T->ptr[2]=新(tnode);
newtree(T->ptr[2]);
}
fillto(T->ptr[2],a);
}
否则{
如果(T->ptr[1]==NULL){
newtree(T->ptr[1]);
T->ptr[1]=新(tnode);
}
fillto(T->ptr[1],a);
}
}
}
tnode*datatnode(字符串s){
int l=0;
T节点*T;
t节点*E;
T=新(tnode);
charc[0];
新树(T);
E=T;

而(l你应该删除下面的“=”符号

 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;

}
tnode*datatnode(字符串s){
int l=0;
T节点*T;
t节点*E;
T=新(tnode);
字符c;
新树(T);
E=T;
int a=s.长度();

而(l你应该删除下面的“=”符号

 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;

}
tnode*datatnode(字符串s){
int l=0;
T节点*T;
t节点*E;
T=新(tnode);
字符c;
新树(T);
E=T;
int a=s.长度();

虽然(l很难从代码中说出来(因为你必须在头脑中运行它)。最好将其调试出来。在代码的关键点调用一些调试程序,并尝试找到精确的代码行……这可能会产生大量调试,具体取决于数据集的大小

我猜你可能会找到一个不好的地址或类似的东西,这就是为什么程序会意外地立即死亡的原因!所以我建议你在指针检查时要非常安全。例如:

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

    if (T != NULL){

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

        :
        :

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

}
基本上,每当您使用传递给函数的指针时,您都应该检查它是否为null。这通常是一种很好的代码实践,可以帮助您找到错误:)

int初始化也可以是:

int i = 0;
而不是

int i = '\0';

很难从代码中说出来(因为你必须在头脑中运行它)。最好是调试出来。在代码的关键点调用一些调试程序,并尝试定位代码的精确行……这可能会产生大量调试,具体取决于数据集的大小

我猜你可能会找到一个不好的地址或类似的东西,这就是为什么程序会意外地立即死亡的原因!所以我建议你在指针检查时要非常安全。例如:

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

    if (T != NULL){

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

        :
        :

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

}
基本上,每当您使用传递给函数的指针时,您都应该检查它是否为null。这通常是一种很好的代码实践,可以帮助您找到错误:)

int初始化也可以是:

int i = 0;
而不是

int i = '\0';

导致错误的基本缺陷在于“void fillto(tnode*&T,int a)”函数中:

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

由于函数newtree不检查指针是否为空,因此最终会取消对newtree中空指针的引用。导致错误的基本缺陷在于“void fillto(tnode*&T,int a)”函数:

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

当NexTrand函数没有检查指针是否为空时,你就终止了NeXTea[/P><代码> T = No.NoT(TnOutle);t= DATA节点(S);< /COD> >代码>新< /COD>内存,然后立即泄漏。不是崩溃的原因。你尝试过调试代码吗?此外:为什么C++代码看起来像C?(除了用<代码> Mulalc < /代码>用<代码> < <代码> >代码> Prtff <代码> >代码> Cuth<代码>,实际上如果您的软件写C++代码,实际上使用该语言。作为旁注:您确实意识到您正在泄漏内存,对吗?BTW:可能不是该源的唯一问题,而是<代码> Char C[ 0 ]。<代码> > t=新(tNoDB);t=数据节点(s);<代码> >代码>新< /COD>内存,然后立即泄漏。不是崩溃的原因。您尝试调试代码吗?此外:为什么C++代码看起来像C?(除了用<代码> Mulalc < /代码>用<代码> < <代码> >代码> Prtff <代码> >代码> Cuth<代码>,实际上如果您的软件写C++代码,实际上使用该语言。作为旁注:您确实意识到您正在泄漏内存,对吗?BTW:可能不是该源的唯一问题,而是<代码> Char C[ 0 ]。
在我看来有点可疑。也就是说,你在
while
循环中越界了。也就是说,你在
while
循环中越界了。