我在解决此错误时遇到问题。我在C中实现了一个红黑树,并且在特定位置遇到了分段错误(第29行)
TNODE *tree_add(TNODE *root, const KEY k, const VALUE v) {
LNODE *lnode = NULL;
if (root == NULL) {
TNODE *node = talloc(k);
lnode = lalloc(v);
node->head = lnode;
node->tail = lnode;
node->is_red = true;
return node;
}
if (strcmp(k, root->key) < 0) {
root->left = tree_add(root->left, k, v);
} else if (strcmp(k, root->key) > 0) {
root->right = tree_add(root->right, k, v);
} else {
if (strcmp(k, root->key) == 0) {
lnode = lalloc(v);
root->tail->next = lnode;
root->tail = lnode;
root->tail->next = NULL;
}
}
if (is_red(root->right) && !is_red(root->left)) { //is_red seg faulting
root = rotate_left(root);
}
if (is_red(root->left) && is_red(root->left->left)) {
root = rotate_right(root);
}
if (is_red(root->left) && is_red(root->right)) {
flip_colors(root);
}
return root;
}
以下是is_red
功能:
bool is_red(const TNODE *h) {
bool is_red = h->is_red;
return is_red;
}
在实现将BST转换为RB树的最后三个if语句之前,代码工作正常。有点奇怪的是,当我调试is_red
时,变量is_red
出现为true
。这意味着我没有访问受限制的内存。但是,一旦我从is_red
函数返回到tree_add
,我就会出现seg错误。
为了进一步说明,这里是TNODE结构:
typedef struct tnode {
KEY key; // Search key for this binary search tree node.
struct tnode *right; // Right child.
struct tnode *left; // Left child.
LNODE *head; // Head of the linked list storing the values for the search key.
LNODE *tail; // Tail of the linked list storing the values for the search key.
bool is_red; // Flag use only in red-black trees to denote redness.
} TNODE;
答案 0 :(得分:2)
在进行IS_RED检查之前,您需要确保正确的子和左子项存在: 取代
if (is_red(root->right) && !is_red(root->left)) //is_red is giving me seg fault
与
if (root->right && is_red(root->right) && root->left && !is_red(root->left))
请同样检查其他地方。