【发布时间】:2022-11-30 23:56:31
【问题描述】:
我正在尝试将节点插入二叉树。这是我创建 Node 的功能(其余已完成)。
void BVSCreate_function(TNodef *rootPtr, function_save token) {
TNodef *newPtr = malloc(sizeof(struct tnodef));
if (newPtr == NULL) {
fprintf(stderr, "99");
return;
}
TNodef init;
string initStr;
initStr.str = NULL;
initStr.length = 0;
initStr.alloc = 0;
newPtr = &init;
newPtr->content = &initStr;
newPtr->leftPtr = NULL;
newPtr->rightPtr = NULL;
newPtr->return_type = token.ret_value;
newPtr->parameters = token.param_count;
strCpyStr(newPtr->content, token.content);
rootPtr = newPtr;
}
void BVSInsert_function(TNodef *rootPtr, function_save token) {
if (rootPtr == NULL) {
BVSCreate_function(rootPtr, token);
} else {
if ((strCmpStr(token.content, rootPtr->content)) < 0) {
BVSCreate_function(rootPtr->leftPtr, token);
} else
if ((strCmpStr(token.content, rootPtr->content)) > 0) {
BVSCreate_function(rootPtr->rightPtr, token);
}
}
}
当 TNodef 和 function_save 是结构时:
typedef struct {
string *content;
int param_count;
int ret_value;
} function_save;
typedef struct tnodef {
string *content;
struct tnodef *leftPtr;
struct tnodef *rightPtr;
int parameters;
int return_type;
} TNodef;
string 被定义为这个结构:
typedef struct {
char *str; // content of string
int length; // length of string
int alloc; // amount of memory allocated
} string;
strCpystr 功能:
int strCpyStr(string *s1, string *s2) {
int len2 = s2->length;
if (len2 > s1->alloc) {
if (((s1->str) = (char *)realloc(s1->str, len2 + 1)) == NULL) {
return 1;
}
s1->alloc = len2 + 1;
}
strcpy(s1->str, s2->str);
s1->length = len2 + 1;
return 0;
}
我正在尝试在二叉树中创建一个节点,并将来自 struct function_save 的信息放在那里。
但是当我尝试在插入后打印这棵树时,它告诉我那棵树仍然是空的。
【问题讨论】:
-
声明
TNodef init后,分配newPtr = &init是一个非常糟糕的主意。 -
一个更糟糕的想法是分配
newPtr = malloc(...),然后用newPtr = &init覆盖它。 -
这两种情况(分别和一起)的结论是,需要对内存分配和赋值有更基本的了解。
-
@bbbbbbbbb 所以我需要删除 newPtr = &init 是吗?
-
@ryyker 我添加了我的功能
标签: c binary-tree binary-search-tree