1 创建
递归地调用即可
void init_tree(node** p)
{
int elm;
scanf("%d", &elm);
if(elm)
{
*p = (node*)malloc(sizeof(node));
(*p) -> data = elm;
printf("create %d node's left child: ", (*p) -> data);
init_tree(&(*p) -> left);
printf("create %d node's right child: ", (*p) -> data);
init_tree(&(*p) -> right);
}
else
{
*p = NULL;
return;
}
}
顺便注意一下,C中指针作为函数的参数和返回值
在上面的函数中传递的是一个指向指针的指针,以使函数中使用malloc来动态地分配空间。
如果直接使用指针则不行,因为编译器要为每个函数参数制作临时副本,对于指针也不例外,它的副本即是实参所指向对象的内存地址,如果函数中修改了形参指向的内容,实参所指向的内容也作了相应的修改,这就是为什么指针可以用作输出参数的原因。但是对于上例中,形参直接开辟了新的内存空间,它所指向的内存地址已经改变了,而实参的指向却丝毫没变,还会造成内存泄漏。解决方法就是用一个指向实参指针的指针作为形参,是p指向root这个指针(而不是root的副本),这时,动态分配的空间传给了*p,而这个*p就是root,所以实现了为root分配空间。
也可以用另一个方法实现内存动态分配
char* GetMemory(int num)
{
char* p = (char*)malloc(num*sizeof(char));
return p;
}
void Test(void) {
char *str = NULL;
str = GetMemory(100);
strcpy(str, "hello");
cout<< str << endl;
free(str);
}
还有一点就是,一定不能返回指向栈内存的指针,如
char *GetString(void)
{
char p[] = "hello world";
return p; // 编译器将提出警告
}
但这样可以:
char* getstring(int num)
{
c