2013-01-06 35 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