2013-01-06 12 views
-5
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无效的类型参数 - >(有结构节点) 53,57,72,76参数太少函数“插入”试图让二叉树弦乐

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

请正确格式化并缩进代码。 – Swapnil

+1

哇,这需要一些时间来格式化...... – Flagbug

+2

当我们不知道它们对应的代码的实际行数时,行号并没有帮助。 – interjay

回答

4

你有很多问题,你在混合指针和它们指向什么。

例如,在这个代码:

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

您有几个严重的问题:

  1. 的malloc返回一个指向内存的指针,而不是一个具体的结构。因此,试图将其返回的指针转换为struct节点将不起作用。你应该把它转换成一个struct node *(一个指向节点的指针)而不是一个具体节点。
  2. 叶是指向节点的指针。如果尝试解引用它并将其设置为等于另一端的节点,那么您将尝试写入节点指向的内存,而不是更改指针指向的位置。您可能想要做其他事情(如下所述)。
  3. 将像101这样的任意数字传入malloc是非常不安全和浪费的。你应该让malloc通过传入sizeof(struct node)来给你适当的空间。

更重要的是,虽然你试图改变插入函数内部的叶指针,但是通过值传递叶。为了改变叶指针指向哪个节点,你应该传递一个指向叶指针的指针,而不是叶指针本身。尝试更改签名以使用struct node** leaf,然后更新代码,以便在代码中重新分配叶指向的指针。

这里有很多其他的指针错误,但最终我认为它们都来自混淆指针和它们指向的内容。修正代码时,请记住是否要更改指针指向的对象,或首先指向哪个对象。

希望这会有所帮助!

+0

“你应该把它转换成一个'struct node *'(指向一个节点的指针)而不是一个具体节点。”如何“编译C程序时,不应该抛出它*”,因为从'void *'到'type *'的隐式转换是自动的。“和+1,helluva工作格式意大利面条。 – WhozCraig

+0

@ WhozCraig-哦,哎呀,这是C,而不是C++。 :-)另外,用于重新格式化代码的功劳并不适合我;我只保留它。 – templatetypedef

+0

不过,很好的回答,尤其是关于OP的总结,让我们看看它们的指针使用情况。 – WhozCraig