Search code examples
ccloneavl-tree

BUS error in cloneing an avl tree in c


I am trying to clone an AVLTree in C,but I have got

BUS ERROR:10

in my code. I really need to start to start improving my programming skills, a lot. That's why every other week, I've been trying to practice some programming exercises. For this one, I decided to do a basic AVL tree. But I am having so much difficulty with it.

    typedef struct AVLTreeNode {
    int key; 
    int value;  
    int height; 
    struct AVLTreeNode *parent; 
    struct AVLTreeNode *left; 
    struct AVLTreeNode *right; 
} AVLTreeNode;

typedef struct AVLTree{
    int  size;      // count of items in avl tree
    AVLTreeNode *root; // root
} AVLTree;

AVLTreeNode *newAVLTreeNode(int k, int v )
{
    AVLTreeNode *new;
    new = malloc(sizeof(AVLTreeNode));
    assert(new != NULL);
    new->key = k;
    new->value = v;
    new->height = 0; // height of this new node is set to 0
    new->left = NULL; // this node has no child
    new->right = NULL;
    new->parent = NULL; // no parent
    return new;
}

AVLTree *newAVLTree()
{
    AVLTree *T;
    T = malloc(sizeof (AVLTree));
    assert (T != NULL);
    T->size = 0;
    T->root = NULL;
    return T;
}

    AVLTreeNode *CloneAVLTreeNode(AVLTreeNode *r)
{
    AVLTreeNode *n;
    if (r == NULL) return NULL;
    else
    {
        n->key = r->key;
        n->value = r->value;
        n->height = r->height;
        n->parent = r->parent;
        n->left = CloneAVLTreeNode(r->left);
        n->right = CloneAVLTreeNode(r->right);
        return n;
    }

}


AVLTree *CloneAVLTree(AVLTree *T)
{
    AVLTree *New = malloc(sizeof(AVLTree));
    //AVLTree *New;
    AVLTreeNode *p = New->root;
    AVLTreeNode *n = T->root;
    if (n == NULL) return NULL;
    else
    {
        p = CloneAVLTreeNode(n);

    }   
    return New;
}

Can you guys give me some tips and point me in the right direction. This is really annoying me because I know this exercise shouldn't be this difficult.

Thanks in advance.


Solution

  • There are at least following two problems:

    First problem:

    AVLTreeNode *CloneAVLTreeNode(AVLTreeNode *r)
    {
      AVLTreeNode *n;               // here you declare n, but n just points nowhere
      if (r == NULL) return NULL;
      else
      {
        n->key = r->key;            // here n still points nowhere,
                                    // therefore dereferencing it causes the Bus error.
        n->value = r->value;
        n->height = r->height;
        n->parent = r->parent;
        n->left = CloneAVLTreeNode(r->left);
        n->right = CloneAVLTreeNode(r->right);
        return n;
      }
    }
    

    You probably want this:

    AVLTreeNode *CloneAVLTreeNode(AVLTreeNode *r)
    {
      if (r == NULL) return NULL;
      else
      {
        AVLTreeNode *n = malloc(sizeof AVLTreeNode);  // allocate memory for new node
        n->key = r->key;
        n->value = r->value;
        n->height = r->height;
        n->parent = r->parent;
        n->left = CloneAVLTreeNode(r->left);
        n->right = CloneAVLTreeNode(r->right);
        return n;
      }
    }
    

    Second problem:

    AVLTree *CloneAVLTree(AVLTree *T)
    {
      AVLTree *New = malloc(sizeof(AVLTree));
      //AVLTree *New;
      AVLTreeNode *p = New->root;    // here New->root hasn't been initialized either
                                     // so p will point nowhere either 
    
      AVLTreeNode *n = T->root;
      if (n == NULL) return NULL;
      else
      {
        p = CloneAVLTreeNode(n);     // but here you assign p with another value, so the previous 'p = New->root'
                                     // is pointless anyway.
    
      }
      return New;
    }
    

    There are most likely more errors elsewhere.