2013-09-03 2 views
1

이것은 간단한 3 진 트리 구조입니다. 필자는 코드를 올바르게 작성했지만 실행 후 얼마 후에 말합니다 :3 진 트리에 오류가 있습니다.

죄송합니다. 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'을'new'와'printf''를'cout'으로 대체하는 것 말고요?) 사실 당신의웨어가 C++ 코드를 작성한다면 언어를 사용하십시오. – 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"); 
    } 

} 

기본적으로 함수에 전달 된 포인터를 사용할 때는 null이 아닌지 확인해야합니다. 이것은 일반적으로 좋은 코드를 연습하고 버그 :

또한 INT 초기화는 할 수 있습니다 찾을 수 있도록 도움이 될 수 있습니다 :

int i = 0; 

대신

int i = '\0'; 
0

오류를 발생시키는 근본적인 결함을

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

A :에 함수 '무효 fillto (TNODE & T *는을 INT)' 함수 newtree는 포인터가 null인지 검사하지 않고 newtree에서 NULL 포인터를 참조 해제하게됩니다.

관련 문제