试图为字符串创建二叉树

时间:2013-01-06 17:12:40

标签: c data-structures binary-search-tree

insert(char * key, struct node *leaf, int x)
{
    if (x==1) //Customer
    {
        if( strcmp(leaf->customer.IDNo,root->customer.IDNo)==0 )
        {
            *leaf = (struct node) malloc(101);
            *leaf->customer.IDNo = key;
            /* initialize the children to null */
            (*leaf)->left = 0;
            (*leaf)->right = 0;
        }

        else if(strcmp(key,(*leaf)->customer.IDNo)<0)
        {
            insert( key, &(*leaf)->left );
        }

        else if(strcmp(key,(*leaf)->customer.IDNo)>0)
        {
            insert( key, &(*leaf)->right );
        }
    }

    else //Product
    {
        if( strcmp(leaf->product.ProdName,root->product.ProdName)==0 )
        {
            *leaf = (struct node) malloc(101);
            (*leaf)->product.ProdName = key;
            /* initialize the children to null */
            (*leaf)->left = 0;
            (*leaf)->right = 0;
        }

        else if(strcmp(key,(*leaf)->product.ProdName)<0)
        {
            insert( key, &(*leaf)->left );
        }

        else if(strcmp(key,(*leaf)->product.ProdName)>0)
        {
            insert( key, &(*leaf)->right );
        }
    }
}

45,64转换为非标量类型的请求 46赋值使用指针生成整数而不进行强制转换 48,49,51,53,55,57,65,67,68,70,72,74,76无效类型参数 - &gt; (有结构节点) 53,57,72,76函数'insert'的参数太少

Node *search(char * key, struct node *leaf,int x)
{
    struct node * y;

    if (x==1)
    {
        if( leaf != 0 )
        {
            if(strcmp(key,leaf->customer.IDNo)==0)
            {
                y= leaf;
            }

            else if(strcmp(key,leaf->customer.IDNo)<0)
            {
                y= search(key, leaf->left);
            }

            else
            {
                y= search(key, leaf->right);
            }
        }
    }

    else if (x==2)
    {

        if( leaf != 0 )
        {
            if(strcmp(key,leaf->product.ProdName)==0)
            {
                y= leaf;
            }

            else if(strcmp(key,leaf->product.ProdName)<0)
            {
                y= search(key, leaf->left);
            }

            else
            {
                y= search(key, leaf->right);
            }
        }
    }

    else y= 0;
    return y;
}

94,98,112,“搜索”功能的参数太少了

在多行上发生的错误是相似的,所以我需要的是如何修复其中一个的说明,我可以做其余的。

1 个答案:

答案 0 :(得分:4)

你有许多问题需要混淆指针和他们指向的内容。

例如,在此代码中:

*leaf = (struct node) malloc(101);

你有几个严重的问题:

  1. malloc返回指向内存的指针,而不是具体的结构。因此,尝试将其返回的指针强制转换为结构节点将不起作用。您应该将它强制转换为结构节点*(指向节点的指针)而不是具体节点。
  2. leaf是指向节点的指针。如果您尝试取消引用它并将其设置为等于另一侧的节点,您将尝试写入节点指向的内存,而不是更改指针指向的位置。您可能想要做其他事情(如下所述)。
  3. 将像101这样的任意数字传递给malloc非常不安全和浪费。您应该通过传入sizeof(struct node)来请求malloc为您提供适当的空间。
  4. 更重要的是,问题是你试图改变插入函数内部的叶子指针,但是正在通过值传递叶子。为了更改叶子指针指向的节点,您应该传入指向叶子指针的指针,而不是叶子指针本身。尝试更改签名以使用struct node** leaf,然后更新代码,以便在代码中重新分配叶子指向的指针。

    这里有许多其他指针错误,但最终我认为它们都源于令人困惑的指针和他们指出的内容。修复代码时,请务必记住是否要更改指针指向的对象,或者首先指向哪个对象。

    希望这有帮助!