2017-12-01 33 views
0

모스 인코더 - 디코더를 만들려고했는데 배열이 아닌 이진 검색 트리를 사용해야합니다. 다음 부분은 이전에 텍스트 파일에서 생성 한 문자 배열을 사용하고이를 기반으로 검색 트리를 만듭니다.문자열에서 이진 검색 트리를 만드는 방법은 무엇입니까?

btree_base 문자 배열의 데이터 형식은 다음과 같습니다. "(문자) (모스 부호) | (문자) (모스 부호) |" 등 (예 : e. | t - | z - .. | ...).

참고 : 문자열이 처음부터 끝까지 읽어내는 것에 의해, 균형 탐색 트리가 내가 아는

이진 트리의 생성이 개 실패입니다

, 생성 될 수있는 방식으로 데이터를 포함하고, 왜냐하면 내가 코드를 실행할 때 btree_print 함수는 콘솔에 아무 것도 출력하지 않기 때문에 NULL 포인터가 전달 되었기 때문입니다.

제 궁금한 점이 그것이 무엇이며 문제를 해결할 수있는 이유는 무엇입니까? 포인터가 엉망이 되었습니까? 아니면 루트 포인터를 전달할 때 이중 간접 참조를 사용해야합니까? 나는 포인터를 이해하지 못하기 때문에 피하려고 노력했다. 당신이 값으로 build에 루트 노드를 통과하고 있기 때문에

typedef struct BinTree{ 
    char letter; 
    char code[6]; 
    struct BinTree *left, *right; 
} BTree; 

BTree* add(BTree* root, char ch, char* code, int length){ 
    int i; 
    char a; 
    if (root == NULL) { 
     BTree *new = (BTree*) malloc(sizeof(BTree)); 
     new->left = new->right = NULL; 
     new->letter = ch; 
     for(i=0; i<length; i++) new->code[i] = code[i]; 
     new->code[length] = '\0'; 
     return new; 
    } 

    a=root->letter; 

    if (ch < a) root->left = add(root->left, ch, code, length); 
    else if (ch > a) root->right = add(root->right, ch, code, length); 

    return root; 
} 

void build(BTree* root, char* c, int length){ 
    int i, size=-1; 
    char b, k[6]; 
    for(i=0; i<length; i++){ 
     if(size==-1) b=c[i]; 
     if(c[i]==' ') size=0; 
     if(size!=-1 && c[i]!='|'){ 
      k[size]=c[i]; 
      size++; 
     } 
     if(c[i]=='|'){ 
      k[size]='\0'; 
      root=add(root, b, k, size); 
      size=-1; 
     } 
    } 
} 

void btree_print(BTree* root){ 
    if(root == NULL) return; 

    printf("%c %s\n",root->letter,root->code); 
    btree_print(root->left); 
    btree_print(root->right); 
} 

void btree_del(BTree* root){ 
    if(root==NULL) return; 

    btree_del(root->left); 
    btree_del(root->right); 
    free(gyoker); 
} 

int main(){ 
    char btree_base[238]; 
    BTree* bin_root = NULL; 

    build(bin_root, btree_base, 238); 

    btree_print(bin_root); 

    btree_del(bin_root); 
    return 0; 
} 
+0

처럼 당신이 단지 root 전달할 것 의미있다;'에서 오는? VS ('cl.exe')에 대해 gcc,'-Weverything' 또는'/ Wall' (또는'/ W4')와 같은 * 경고가 활성화되어 컴파일하고 있습니까? –

+0

Oh, 죄송합니다. 'uj'는 'new'라고되어 있습니다. – Heves

답변

0

, 변경은 값이 호출하는 함수에 반영되지 않습니다의로했다. 그래서 짐작할 수 있듯이 루트에 대한 포인터를 전달해야 BTree **이됩니다.

build(&bin_root, btree_base, 238); 

그런 다음 build 내부의이 같은 *를 앞에 의해 당신이 역 참조 첫째 root에있는 루트 노드를 액세스 할 때

*root=add(*root, b, k, size); 
add도 않고, 그런 식으로 작동 이익을 얻을 수

업데이트 된 노드를 반환하는 것보다 build 이후 어떤 이미이 BTree **가`uj-> 편지 쓰기 = CH 수행이

add(root, b, k, size);