这是构建二元树的非常简单的功能。
我使用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;
}
}
}
答案 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
的结果。)