链接列表......不会改变

时间:2011-04-02 10:03:42

标签: c

这是构建二元树的非常简单的功能。

我使用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;
        }
    }
}

1 个答案:

答案 0 :(得分:3)

如果你有这个:

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

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

功能something中的分配不会更改调用方a的值(此处为main)。指针以值传递,这意味着指针值的副本被赋予函数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;
}

(您无需在malloc中投射C的结果。)