【发布时间】:2013-04-16 17:16:43
【问题描述】:
在bst中检查节点是否为空后,当我尝试为bst的成员赋值时出现分段错误
#include <stdio.h>
#include <stdlib.h>
typedef int Data_Item;
struct Bst2_Node
{
int key;
Data_Item data;
struct Bst2_Node *left, *right;
};
typedef struct Bst2_Node BStree2_node;
typedef BStree2_node** BStree2;
BStree2 bs_tree2_ini(void)
{
BStree2 bst;
bst =(BStree2)malloc(sizeof(BStree2_node *));
*bst=NULL;
return bst;
}
void bs_tree2_insert(BStree2 bst, int key, Data_Item data)
{
if(*bst==NULL)
{
(*bst)->key = key;
(*bst)->data = data;
}
else if(key < (*bst)->key)
{
bs_tree2_insert(&(*bst)->left, key, data);
}
else if(key > (*bst)->key)
{
bs_tree2_insert(&(*bst)->right, key, data);
}
else return;
}
Data_Item *bs_tree2_search(BStree2 bst, int key)
{
if(key==(*bst)->key)
{
return &(*bst)->data;
}
else return NULL;
}
void bs_tree2_traversal(BStree2 bst)
{
if(!*bst) return;
bs_tree2_traversal(&(*bst)->left);
printf("%d\n", (*bst)->data);
bs_tree2_traversal(&(*bst)->right);
}
static void btree_free(BStree2_node *bt)
{
if(bt == NULL) return;
btree_free(bt->left);
btree_free(bt->right);
free(bt);
}
void bs_tree2_free(BStree2 bst)
{
btree_free(*bst);
free(bst);
}
int main(int argc, char** argv)
{
int a;
int b;
a = 1;
b = 2;
BStree2 bst = bs_tree2_ini();
printf(".");
bs_tree2_insert(bst, a, b);
//bs_tree2_traversal(bst);
bs_tree2_free(bst);
return (0);
}
另外,当我将 a 指针初始化为 null 时,这是否意味着内容也为 null? 抱歉格式化了
【问题讨论】:
-
在
bs_tree2_insert()中,您明确检查 *bst 是否为 NULL,如果是则取消引用它?有点不对劲…… -
.. 与您需要做的事情相反。如果为空,则创建一个新节点,然后设置您的字段值。本文中没有动态分配,这将使构建动态分配的 BST 变得困难......