抱歉我的英语不好,我已经为Splaying树写了C代码,但是当我把#34; Find()"在main函数中操作,我无法初始化Tree,也就是说,没有行" Find()" ,使用GDB,我发现my_tree的值是" 0x0"当行中的断点" MakeEmpty",但添加行"查找"时,值为" 0x7fffffffbeb0"。我知道Find()函数有问题,但我不明白为什么后面的语句会感染前一个语句?
#include<stdio.h>
#include "SPTree.c"
void main()
{
Position my_tree;
my_tree = MakeEmpty( my_tree );
my_tree = Insert( 5, my_tree );
my_tree = Insert( 6, my_tree );
Position P = Find( 5, &my_tree );
}
这是声明
struct SPNode;
typedef struct SPNode *Position;
typedef struct SPNode *SPTree;
typedef int ElementType;
和树节点
struct SPNode
{
ElementType Element;
SPTree Left;
SPTree Right;
};
这是插入
SPTree Insert( ElementType X, SPTree tree )
{
if( tree == NULL )
{
//此时 tree 是一棵空树,分配空间并创建一棵树
tree = malloc( sizeof( struct SPNode ) );
if( tree == NULL )
printf("Out of space!!!\n");
else
{
tree->Element = X;
tree->Left = tree->Right = NULL;
}
}
else
{
//递归插入 X 到合适的子树中
if( X < tree->Element )
tree->Left = Insert( X, tree->Left );
else if( X > tree->Element )
tree->Right = Insert( X, tree->Right );
else
//X已经在树中,什么也不做
;
}
return tree;
}
这是在我的github回购中查找(因为它太长了):https://github.com/hengyicai/Find/blob/master/Find.c
我感到困惑的是:当主要功能像这样
void main()
{
Position my_tree; //line 1
my_tree = MakeEmpty( my_tree );
my_tree = Insert( 5, my_tree );
my_tree = Insert( 6, my_tree );
}
我在第1行调试断点,并打印my_tree的值为0x0,如下所示
请看这里:&#34; https://raw.githubusercontent.com/hengyicai/Find/master/&#34;请参阅Pic_1.png。
但将Find()finction添加到main.c
之后#include<stdio.h>
#include "SPTree.c"
void main()
{
Position my_tree;
my_tree = MakeEmpty( my_tree );
my_tree = Insert( 5, my_tree );
my_tree = Insert( 6, my_tree );
Position P = Find( 5, &my_tree );
}
我得到my_tree的值如下:请参阅上面链接中的Pic_2.png。
为什么my_tree的值与前一个不同,只需将Find()添加到最后一行?
答案 0 :(得分:0)
MakeEmpty()
函数返回指针或值?
代码非常奇怪。
我想MakeEmpty()
可以返回指向空Position
结构的指针。
通常你可以选择2路,从函数返回一个指针:
1 - 将指针检索为传递参数;
2 - 将指针检索为返回值;
typedef foo_t;
foo_t foo;
pass_bar(foo_t **pass_foo)
{
...
//Set the pointer to the **pass_foo parameter
}
foo_t* return_foo(void)
{
foo_t *my_foo;
//Set the pointer my_foo to a valid memory address for foo_t
...
return my_foo;
}
您添加了标记pointers
,但在这段代码中您不使用任何指针...