这是简单的三元树结构。我已正确编写代码,但在运行它之后说了一段时间后:
抱歉,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;
}
答案 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 :(得分: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");
}
}
基本上每次使用传入函数的指针时,都应检查它是否为空。这通常是很好的代码练习,可以帮助您找到您的错误:)
int初始化也可以是:
int i = 0;
而不是
int i = '\0';
答案 2 :(得分:0)
导致错误的根本缺陷在于'void fillto(tnode *&amp; T,int a)'函数:
...
if(T->ptr[1]==NULL){
newtree(T->ptr[1]);
...
}
由于函数newtree不检查指针是否为null,因此最终取消引用newtree中的NULL指针