我试图创建一个莫尔斯编码器解码器,我必须用二叉搜索树(而不是数组)来做。以下部分应该采用一个字符数组(我们之前从文本文件创建),并基于它创建一个搜索树。
在btree_base字符数组中,我们有数据,格式为:"(信)(摩尔斯电码)|(信)(摩尔斯电码)|">等(例如。e .|t -|z --..|...).
注意:字符串包含数据的方式是,通过从头到尾读取数据,将创建一个平衡的搜索树
二叉树的创建是不成功的,我知道,因为当我运行代码时,btree_print函数不会在控制台上打印任何内容,我发现这是因为将 NULL 指针传递给它。
我的问题是为什么会这样以及如何解决问题?我是否弄乱了指针,或者在传递根指针时需要使用双间接寻址?我真的不明白**指针,所以我试图避免它们。
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] = ' ';
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]=' ';
root=add(root, b, k, size);
size=-1;
}
}
}
void btree_print(BTree* root){
if(root == NULL) return;
printf("%c %sn",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;
}
由于将根节点传递给按值build
,因此对其值所做的任何更改都不会反映到调用函数。因此,正如您所猜测的那样,您需要传入一个指向根的指针,这将使它成为BTree **
。
build(&bin_root, btree_base, 238);
然后在build
内部,当您要访问根节点时,您必须首先取消引用root
,方法是在它前面加上如下*
:
*root=add(*root, b, k, size);
add
也可以从这样的工作中受益,而不是返回更新的节点。既然build
已经有了BTree **
,这意味着您只需像这样通过root
add(root, b, k, size);