2013-09-03 7 views
1

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

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

'T = new (tnode); T = datatnode (s); '' '' '' новый' некоторый объем памяти, а затем немедленно протекать. Однако не причина аварии. – BoBTFish

+0

Вы пробовали отлаживать свой код? Кроме того: почему ваш код на C++ похож на C (кроме подстановки 'malloc'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' вы теряете память, правильно? – Grizzly

+2

Btw: Вероятно, это не единственная проблема с этим источником, но 'char c [0];' выглядит подозрительно для меня. – Grizzly

ответ

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; 

} 
+0

То есть вы выходите за пределы в 'while' петля. – BoBTFish

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 i = 0; 

вместо

int i = '\0'; 
0

Основной порок, который вызывает ошибку находится в 'пустом fillto (Tnode * & T, Int а)' функцию:

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

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