c - 在c中克隆avl树时出现总线错误

标签 c clone avl-tree

我正在尝试用 C 语言克隆 AVLTree,但我已经得到了

BUS ERROR:10

在我的代码中。 我真的需要开始大量提高我的编程技能。这就是为什么每隔一周我就尝试练习一些编程练习。对于这个,我决定做一个基本的 AVL 树。但我对此有很多困难。

    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;
}

你们能给我一些建议并指出我正确的方向吗?这真的让我很恼火,因为我知道这个练习不应该这么困难。

提前致谢。

最佳答案

至少存在以下两个问题:

第一个问题:

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;
  }
}

您可能想要这个:

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;
  }
}

第二个问题:

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;
}

其他地方很可能存在更多错误。

关于c - 在c中克隆avl树时出现总线错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50102689/

相关文章:

javascript - 将 HTML 从原始文档复制到弹出窗口(使用 JQuery)

javascript - 如何在 JavaScript 中克隆表单并保留事件绑定(bind)

c++ - 如何在不知道其父节点的情况下旋转子树

c - 如何将一个子进程中的 stdout 链接到 C 中另一个子进程中的 stdin?

c - mmap() 总是返回 -1

linux - 迁移部署在 Linux VM 上的软件?

data-structures - 为什么这个 AVL 树实现将位打包成 64 位而不是 32 位实现的指针?

c fscanf 按模式保存

c - for中变量声明的顺序

c++ - AVL 树永远不会有不均衡的平衡 C++