2011-04-02 147 views
0

這是構建二元樹的非常簡單的函數。鏈接列表...不更改

我用Build_tree(first_TR, A);它打印 補充說:「第一,加入第一,添加爲第一,添加爲第一,添加爲第一, 添加爲第一,添加爲第一,添加爲第一,添加爲第一,加作爲第一「,」。

這意味着first_TR == 0。爲什麼?我也試過Build_tree(&first_TR, A); 不工作:(

typedef struct SElementBST { 
    struct SElementBST *left, *right; /* wskaźnik na kolejny element listy */ 
    unsigned slowo[DlugoscSlow+1]; /* przechowywana wartość */ 
} TBST; 

TBST *first_TR = 0; 

void Build_tree(TBST *first, unsigned char array[IloscSlow][DlugoscSlow+1]) 
{ 

    int i,k,m; 
    TBST *tmp, *parent; 

    for(i=0;i<IloscSlow;i++) 
    { 

     if(!first_TR) 
     { 
      first = (TBST*) malloc(sizeof(TBST)); 
      first -> left = 0; 
      first -> right = 0; 
      printf("added as first, "); 
      for(k=0;k<DlugoscSlow+1;k++) 
        first -> slowo[k] = array[i][k]; 
     } 
     else 
     { 
      tmp = first; 

      while(tmp != 0) 
      { 
       k = 0; 
       parent = tmp; 

       while ((tmp->slowo[k] == array[i][k]) && (k<DlugoscSlow-1)) 
           k++; 

       if(tmp->slowo[k] < array[i][k]) tmp = tmp -> right; 
       else tmp = tmp -> left; 

      } 

      tmp = (TBST*) malloc(sizeof(TBST)); 
      tmp -> left = 0; 
      tmp -> right = 0; 

      for(m=0;m<DlugoscSlow+1;m++) 
       tmp-> slowo[m] = array[i][m]; 

      if(parent->slowo[k] < array[i][k]) parent -> right = tmp; 
      else parent -> left = tmp; 
     } 
    } 
} 
+2

您的格式不一致。它不一定是完美的,但應該看起來有點像漂亮打印機的輸出。此外,幾乎每個人(幾乎每個程序員)都能理解英語。不幸的是,關於其他語言也不能這樣說,所以你應該用這種語言來保存變量和註釋。 – phihag 2011-04-02 10:09:51

+0

如果你正在構建的是BST,爲什麼你的問題的標題提到了鏈表? – MAK 2011-04-02 11:47:41

回答

3

如果你有這樣的:

void something(type *p) { 
    p = somethingelse; 
} 

int main() { 
    type *a = ...; 
    something(a); 
} 

在功能something的分配將不會在調用者(main這裏)改變a值。指針通過值通過值,這意味着指針的值的副本被賦予函數something

如果您希望能夠更改調用程序中的指向a的指針,則需要將指針傳遞給指針。

void something(type **p) { 
*p = somethingelse; 
} 

int main() { 
type *a; 
something(&a); 
} 

你不改變first_TR在代碼的任何地方。所以它一直保持它的空值。

要麼你不需要first_TR,你的代碼應該是這樣的:

if(!first) 
{ 
first = malloc(sizeof(TBST)); 
... 
} 

或者你確實需要它,你可以這樣做:

if(!first_TR) 
{ 
first = malloc(sizeof(TBST)); 
... 
first_TR = first; 
} 

(你不需要在C中投下malloc的結果。)

+2

事實上,你甚至[不應該](http://en.wikipedia.org/wiki/Malloc#Disadvantages_to_casting)鑄造malloc()。 – hynek 2011-04-02 10:14:57