c - 插入操作中段错误错误

标签 c segmentation-fault binary-search-tree insertion

我想编写一个通用的二叉搜索树。 当我尝试执行插入函数时出现段错误。

所以这里是(我认为)相关的代码片段:

/* node.h */
typedef struct {
   unsigned int elemSize;
   void *value;
   void *leftChild;    
   void *rightChild;   
   void (*freefn)(void *);     // free function
} Node;

void newNode(Node *node, unsigned int elemSize, void *value) {
    node->elemSize = elemSize;
    node->value = value;
    node->leftChild = NULL;
    node->rightChild = NULL;
}

void nodeSetValue(Node *node, void *value) {
    node->value = value;
}

void nodeSetLeftChild(Node *node, Node *leftChild) {
    node->leftChild = leftChild;
}

/* btree.h */
typedef struct {
    unsigned int elemSize;
    Node *root;                     
    void (*freefn)(void *);         // free function    
    int (*cmpfn)(void *, void *);   // compare function
} Btree;


void btreeInsertHelper(Node *node, void *value, int (*cmpfn)(void *, void *)) {
    if(node == NULL) {
        nodeSetValue(node, value);
        return;
    }
    int cmpresult = cmpfn(value, nodeGetValue(node));
    if(cmpresult >= 0) {
        Node *rightChild = nodeGetRightChild(node);
        if(rightChild == NULL) {
            rightChild = (Node *) malloc(sizeof(Node));
            nodeSetRightChild(node, rightChild);
        }
        btreeInsertHelper(rightChild, value, cmpfn);
    } else {
        Node *leftChild = nodeGetLeftChild(node);
        if(leftChild == NULL) {
            leftChild = (Node *) malloc(sizeof(Node));
            nodeSetLeftChild(node, leftChild);
        }
        btreeInsertHelper(leftChild, value, cmpfn);
    }
    return;
}

void btreeInsert(Btree *btree, void *value) {
    if(btree->root == NULL) {
        Node *root = (Node *) malloc(sizeof(Node));
        newNode(root, sizeof(btree->elemSize), value);
        btree->root = root;
        return;
     } else {
        btreeInsertHelper(btree->root, value, btree->cmpfn);
        return;
   }
}

/* test.c */
int intCmp(void *a, void *b) {
    return *(int *)a - *(int *)b;
}

int main() {

    Btree btree;
    newBtree(&btree, sizeof(int), NULL, intCmp);

    int a = 10;
    int b = 9;
    int c = 11;
    int d = 3;

    btreeInsert(&btree, &a);
    btreeInsert(&btree, &b);
    btreeInsert(&btree, &c);
    btreeInsert(&btree, &d);

    return 0;
}

我感觉我在某些时候传递了错误的引用

最佳答案

我的工作使用了一个简单的编辑器。 现在,在安装 IDE 并调试我的程序后,我发现在 btreeInsertHelper 函数的开头“node”从未变为 NULL。相反,我必须检查 node->value 是否为 NULL。跳过 if 子句后,比较函数将“value”与 NULL 值进行比较。

感谢您的帮助。为了完整起见,我的 newBtree 函数:

void newBtree(Btree *btree, unsigned int elemSize, void(freefn (void*),int(cmpfn)(void *,void *)) {
    btree->elemSize = elemSize;
    btree->freefn = freefn;
    btree->cmpfn = cmpfn;
    btree->root = NULL;
}

关于c - 插入操作中段错误错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28279021/

相关文章:

c - 如何使用现有文件创建新的 Xcode 项目?

c - 为什么当 n>500 时会出现段错误?用 C 编码

c++ - segmentation 故障的常见原因的明确列表

c - 随机 "munmap_chunk()"和段错误

c++ - 不理解这个二叉搜索树 (BST) 示例算法

javascript - 二叉树中每个节点的坐标?

c - 如何在 C 中返回 ReadLine() 函数?

c - C 中的赋值

c - execv 并测试正确的绝对路径

c++ - 数组 BST 的插入排序如何工作?