这是我的代码。我一直收到错误
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;
}
答案 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);