我是C的新手,我正在尝试编写数据结构,主要是三元搜索树。我正在假设(现在)正在传入有效的char输入。我的插入函数存在一些问题。请注意,我也在最后一个TSTnode中插入原始字符串,其中str的最后一个字符也将被保存。
这是我到目前为止所拥有的
struct TSTnode {
char* word; // NULL if no word ends here
char self;
struct TSTnode *left, *sub, *right;
};
int insert_tst(struct TSTnode** tree, const char* str) {
return _insert(tree, str, 0);
}
int _insert(struct TSTnode** tree, const char* str, int position) {
if((*tree) == NULL) {
*tree = new_tst_node(*(str+position));
position = position + 1;
if(*(str+position) == '\0') {
(*tree)->word = strcpy((*tree)->word,str);
return 1;
}
}
else if ((*tree)->self > *(str+position)) {
position = position + 1;
_insert( &((*tree)->left), str, position);
}
else if ((*tree)->self < *(str+position)) {
position = position + 1;
_insert( &((*tree)->right), str, position);
}
else {
position = position + 1;
_insert( &((*tree)->sub), str, position);
}
return 0;
}
struct TSTnode* new_tst_node(char self) {
struct TSTnode* newNode = (struct TSTnode*) malloc(sizeof(struct
TSTnode));
if (newNode == NULL) {
return NULL;
}
newNode->word = NULL;
newNode->self = self;
newNode->left = NULL;
newNode->right = NULL;
newNode->sub = NULL;
return newNode;
}
以下是我的测试方法:
struct TSTnode* tree = NULL;
char* words[1] = {"hello"};
for (int i = 0; i < 1; i++) {
if (insert_tst(&tree, words[i]) == 0) {
//print some error
}
else { //success }
编辑 - 我的问题是我没有采用任何条件分支,插入函数直接返回0。
答案 0 :(得分:1)
注意:您对tree
和TSTnode*
混淆使用TSTnode**
。我将使用tree_ptr
作为后者,并假装你也这样做。
你的主张是错误的。执行if((*tree_ptr) == NULL)
的正文。但是,你确实遇到了许多问题。
您不处理*tree_ptr == NULL && *(str+position+1) != '\0'
。
您未正确处理*tree_ptr != NULL && *(str+position+1) == '\0'
。
在0
时,您始终会返回*tree_ptr != NULL || str[1] != '\0'
。
您永远不会分配word
,但您会尊重它。问题是,你不应该再次存储字符串!
您不处理str[0] == '\0'
(空字符串)的情况。
修正:
int insert_tst(struct TSTnode** tree_ptr, const char* str) {
if (!*str)
return 0; /* Zero-length strings are not supported. */
return insert_tst_helper(tree_ptr, str, 0);
}
int insert_tst_helper(struct TSTnode** tree_ptr, const char* str, int position) {
if (*tree_ptr == NULL) {
*tree_ptr = new_tst_node(*(str+position));
if (*tree_ptr == NULL)
return 0; /* Memory allocation error. */
}
if (*(str+position+1) == '\0') { /* If the next char is a NUL */
(*tree_ptr)->is_word = 1;
return 1;
}
else if ((*tree_ptr)->self > *(str+position)) {
position = position + 1;
return insert_tst_helper( &((*tree_ptr)->left), str, position);
}
else if ((*tree_ptr)->self < *(str+position)) {
position = position + 1;
return insert_tst_helper( &((*tree_ptr)->right), str, position);
}
else {
position = position + 1;
return insert_tst_helper( &((*tree_ptr)->sub), str, position);
}
}
未测试。
让我们清理一下。
*(str+position)
简化为str[position]
ch == '\0'
ch == 0
!ch
position = position + 1; return insert_tst_helper(..., str, position);
++position; return insert_tst_helper(..., str, position);
return insert_tst_helper(..., str, position+1);
return insert_tst_helper(..., str+1, 0);
修正:
return insert_tst(..., str+1);
未测试。