gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:21:29 24 4
gpt4 key购买 nike

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

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

/* 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com