这是一项学校作业。当我尝试向BST添加新节点时,我遇到了seg错误。我认为这可能与我如何分配内存有关,但我无法弄清楚如何解决这个问题。
结构代码:
struct tnode {
char* data;
struct tnode* left;
struct tnode* right;
};
typedef struct tnode Tnode;
添加节点功能:
Tnode* add_tnode(Tnode* current_tnode, char* value) {
if (current_tnode == NULL) {
malloc(sizeof(Tnode));
current_tnode->data = value;
current_tnode->left = NULL;
current_tnode->right = NULL;
return current_tnode;
}
else {
if (strcmp(current_tnode->data, value) <= 0) {
add_tnode(current_tnode->left, value);
return current_tnode->left;
}
else {
add_tnode(current_tnode->right, value);
return current_tnode->right;
}
}
}
测试功能的主程序:
int main() {
Tnode* new_node = (Tnode*)malloc(sizeof(Tnode));
char* data1 = "Hello";
char* data2 = "Goodbye";
char* data3 = "Hi";
char* data4 = "Bye";
char* data5 = "Hey";
add_tnode(new_node, data1);
add_tnode(new_node, data2);
add_tnode(new_node, data3);
add_tnode(new_node, data4);
add_tnode(new_node, data5);
return 0;
}
这是我回溯分段错误时收到的错误:
#0 0x0000003458478350 in strcmp () from /lib64/libc.so.6
#1 0x00000000004005be in add_tnode (current_tnode=0x601010,
value=0x400708 "Hello") at tree.c:16
#2 0x0000000000400523 in main () at treetest.c:12
我在想当strcmp()试图找到存储在节点中的字符串时,它无法找到它。任何帮助或提示将非常感谢!
答案 0 :(得分:1)
该行(add_tnode
)
malloc(sizeof(Tnode));
应该是
current_tnode = malloc(sizeof(Tnode));
您目前正在立即丢弃malloc
的返回值,这意味着下一行代码会取消引用NULL指针,从而导致您的seg错误。
您还需要在new_node
中明确初始化main
的成员,或者使用calloc
进行分配。并且,如Karoly Horvath所述,使用add_tnode
答案 1 :(得分:1)
另一个问题:
add_tnode
返回新分配节点的地址,但您从不使用它。
答案 2 :(得分:0)
您正在尝试访问“new_node”字段“data”,
但“new_node”未使用数据值初始化。
你需要将这些行移出if子句:
current_tnode->data = value;
current_tnode->left = NULL;
current_tnode->right = NULL;
祝你好运。