当前位置: 首页 > 知识库问答 >
问题:

插入新节点时的AVL树Malloc函数

钦海荣
2023-03-14

我最近在C。。然后我尝试创建一个AVL。。这样做的第一步。就是在每个节点中添加一个额外的组件bf(平衡因子)。。我是这样做的。

    struct tnode{
        int info;
        struct tnode*left;
        struct tnode*right;
        int bf;//new field for avl tree..
                };

每次malloc在插入时为新节点分配地址。。。我将其信息部分分配给用户输入的值。。将左右指针设置为NULL。除此之外,它还将新节点的bf分配给0。。在插入第一个节点(即根节点)后,程序下次在malloc部分甚至无法为新节点分配内存。。。只要我去掉写着newnode的部分-

    int main(){
    int choice,val;
    deci:
    printf("\n1.Insert");
    printf("\n2.Display");
    printf("\n3.Search.");
    printf("\n4.Delete");
    printf("\n5.Naa..");
    scanf("%d",&choice);
    switch(choice){
            case 1:printf("\nEnter element to add:");
                    scanf("%d",&val);
                    add(val);

                    //display();
                    break;
            case 2:display();
                    break;
            case 3:printf("\nEnter element to search for:");
                    scanf("%d",&val);
                    search(val);
                    break;

            case 4:printf("\nEnter element to Delete: ");
                    scanf("%d",&val);
                    deletei(val);
                    display();
                    break;
            case 5:return 0;

            }
    goto deci;
    return 0;
    }


    void add(int val){
    struct tnode * newnode=(struct tnode * )malloc(sizeof(struct tnode *));
    newnode->info=val;
    newnode->left=newnode->right=NULL;
    newnode->bf=0;//problem making,problem solved removing this statement
    if(root==NULL){
            root=newnode;

                    }                       
    else{
        struct tnode*tree=root;
        struct tnode*ptree=NULL;
    while(tree!=NULL){
                    if(val<tree->info){
                                        ptree=tree;
                                        tree=tree->left;

                    }
                    else{
                        ptree=tree;
                        tree=tree->right;
                    }                       


        }   
    if(val<ptree->info){

                ptree->left=newnode;
                tree=ptree->left;


        }
else{
ptree->right=newnode;   
tree=ptree->right;

    }
    }


    }   

共有2个答案

钱黎明
2023-03-14

您的第一个主要错误是您仅为add()中的newnode地址分配了一个空间。您应该将其转换为:

struct tnode * newnode=(struct tnode * )malloc(sizeof(struct tnode));

在这种情况下,您为所需节点分配整个空间。

附言。也请放弃“去”指令,因为使用它是一种不好的做法。

卓胜
2023-03-14

你的问题在这一行:

struct tnode * newnode = (struct tnode *) malloc(sizeof(struct tnode *))

从malloc的C参考

分配未初始化存储的大小字节

如果分配成功,则返回指向所分配内存块中最低(第一个)字节的指针

因此malloc分配一个内存块并返回一个指向该块开头的指针。malloc的参数是您要分配的内存块的大小。

在您的例子中,您传递的是sizeof(struct tnode*)。因此,您正在为指向struct tnode类型值的指针分配足够的内存。如果您想为struct tnode本身分配内存,请将sizeof更改为sizeof(struct tnode)。那么固定行应该如下所示

struct tnode * newnode = (struct tnode *) malloc(sizeof(struct tnode))
 类似资料:
  • 本文向大家介绍在Javascript AVL树中插入节点,包括了在Javascript AVL树中插入节点的使用技巧和注意事项,需要的朋友参考一下 我们可以学习如何在AVL树中插入节点。AVL树中的插入与BST相同,只要我们在树上向下移动,我们只需在插入过程中执行一个额外的步骤,称为平衡树。 这需要计算我们之前已经看到的平衡因子。并且根据配置,我们需要调用适当的旋转方法。在以上说明的帮助下,这些都

  • 我已经验证了avl插入代码的三个来源。在计算高度的所有情况下, 根高度=1最大值(self.getHeight(root.left),self。getHeight(根(右)) 上面给出了一行。 这是我的问题,为什么我们要取左子树和右子树的最大值,并在其中添加一个?如果我们将节点添加到具有最小高度的子树中呢?在这种情况下,两者将具有相同的高度H而不是H 1。 此高度增量应添加为, 我说得对吗?如果是

  • 我有一个二进制搜索树插入方法,可以工作。我正在尝试添加一个Trinode方法,如果高度不平衡,可以平衡它。在我的插入方法中,在插入项之后,在插入方法的末尾,我有一个if语句来检查它是否高度平衡。如果是,则打印“高度平衡”。否则,它会打印出“notheight balanced”,然后对我刚刚插入的项目调用triNodeRestructure方法。当我运行代码时,它在调用triNodeRestruc

  • 当我使用将新节点插入到二叉树中时,它只在子节点的位置插入新节点,即使根节点已经有左、右子节点。它不是访问子节点来创建更深层次的二叉树。 抱歉英语不好。

  • 主要内容:src/runoob/binary/BinarySearchTreeInsert.java 文件代码:首先定义一个二分搜索树,Java 代码表示如下: public class BST < Key extends Comparable <Key >, Value > {     // 树中的节点为私有的类, 外界不需要了解二分搜索树节点的具体实现     private class Node {         private Key key ;         private Val

  • 我试图在二叉树中插入节点,如果我用addNode(Node root)替换方法addNode(Node Node)代码运行良好。这是因为我在第一行声明了吗?请解释一下。addNode方法由于字数限制而不完整,否则它是完整的,运行良好。