导致分段错误的结构

时间:2014-10-30 23:33:24

标签: c segmentation-fault red-black-tree

我在解决此错误时遇到问题。我在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;

1 个答案:

答案 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)) 

请同样检查其他地方。