插入三元搜索树的功能 - C.

时间:2017-09-20 22:05:56

标签: c data-structures

我是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。

1 个答案:

答案 0 :(得分:1)

注意:您对treeTSTnode*混淆使用TSTnode**。我将使用tree_ptr作为后者,并假装你也这样做。

你的主张是错误的。执行if((*tree_ptr) == NULL)的正文。但是,你确实遇到了许多问题。

  1. 您不处理*tree_ptr == NULL && *(str+position+1) != '\0'

  2. 的情况
  3. 您未正确处理*tree_ptr != NULL && *(str+position+1) == '\0'

  4. 的情况
  5. 0时,您始终会返回*tree_ptr != NULL || str[1] != '\0'

  6. 您永远不会分配word,但您会尊重它。问题是,你不应该再次存储字符串!

  7. 您不处理str[0] == '\0'(空字符串)的情况。

  8. 修正:

    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);
      然后转为{{{ 1}}
      然后到return insert_tst_helper(..., str+1, 0);
    • 为什么要使用递归???

    修正:

    return insert_tst(..., str+1);

    未测试。