错误:'str'未声明(首次使用此函数)b = bst_inorder(b-> left,str);

时间:2015-09-08 07:31:12

标签: c recursion binary-search-tree

这是我的代码。我一直收到错误

bst.c:30:30: error: ‘str’ undeclared (first use in this function)
b = bst_inorder(b->left, str);

我不确定,因为它已经被宣布了?

#include <stdio.h>

#include <stdlib.h>
#include <string.h>
#include "bst.h"
#include "mylib.h"


struct bstnode {
    char *key;
    bst left;
    bst right;
};

extern bst bst_delete(bst b, char *str);
extern bst bst_free(bst b){
    free (b->key);
    free(b);
    return b;

}

void print_key(char *s){
    print("%\n", s);
}

extern void bst_inorder(bst b, void f(char *str)){
    if (b == NULL){
        return;
    }
    b = bst_inorder(b->left, str);
    print_key(str);
    b = bst_inorder(b->right, str);            
}

extern bst bst_insert(bst b, char *str){
    if (b == NULL){
        b= emalloc(sizeof *b);
        b->key = emalloc((strlen(str)+1) * sizeof(char));
        strcpy(b->key, str);
        return b;
    }
    else if (strcmp(str,b->key) == 0){
        return b;
    }
    else if (strcmp(str,b->key) < 0){
        b->left = bst_insert(b->left,str);
         return b->left;
    }
    else if (strcmp(str, b->key) > 0){
        b->right = bst_insert(b->right, str);
        return b->right;
    }
    return b;
}

extern bst bst_new(){
    return NULL;
}
extern void bst_preorder(bst b, void f(char *str)){
    if (b == NULL){}
}
extern int bst_search(bst b, char *str){
    if (b == NULL){
        return 0;
    }
    else if(strcmp(str,b->key) == 0){
        return 1;
        }
    else if(strcmp(str,b->key) < 0) {
        bst_search(b->left, str);
    }
    else if(strcmp(str,b->key) > 0){
        bst_search(b->right, str);
    }
    return 0;
}

1 个答案:

答案 0 :(得分:2)

bst_inorder不会将char*命名为&#34; str&#34;,而是一个名为&#34; f&#34;的函数。

名称&#34; str&#34;未被声明 - 它仅作为人类读者的提示而被编译器忽略。

原型等同于

void bst_inorder(bst b, void f(char *))

您应该将该函数应用于树中的每个字符串:

extern void bst_inorder(bst b, void f(char *)){
    if (b == NULL){
        return;
    }
    bst_inorder(b->left, f);
    f(b->key);
    bst_inorder(b->right, f);            
}

这使它成为一个通用的遍历函数 - 它允许调用者决定如何处理每个节点,而不必编写自己的遍历代码。

示例:

void print(char *str) { printf("%s\n", str); }
int length = 0;
void count(char *str) { length += strlen(str); }

bst tree = ...
bst_inorder(tree, print); /* Prints the nodes in alphabetical order */
bst_inorder(tree, count);
printf("The tree's total character count is %d\n", length);