모스 인코더 - 디코더를 만들려고했는데 배열이 아닌 이진 검색 트리를 사용해야합니다. 다음 부분은 이전에 텍스트 파일에서 생성 한 문자 배열을 사용하고이를 기반으로 검색 트리를 만듭니다.문자열에서 이진 검색 트리를 만드는 방법은 무엇입니까?
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;
}
처럼 당신이 단지
root
전달할 것 의미있다;'에서 오는? VS ('cl.exe')에 대해 gcc,'-Weverything' 또는'/ Wall' (또는'/ W4')와 같은 * 경고가 활성화되어 컴파일하고 있습니까? –Oh, 죄송합니다. 'uj'는 'new'라고되어 있습니다. – Heves