c - 使用迭代插入函数在第二次插入后初始化二叉搜索树时出现分段错误
问题描述
在尝试将第二个节点插入树后,我遇到了分段错误,引发了分段错误。分段错误是由于initialize
功能还是insert
?以及如何通过更改 server.c 来解决它?
客户端.c 文件:
int main()
{
Tree my_tree;
initialize(&my_tree);
while(1)
{
scanf("%d", &choice);
switch (choice)
{
case 1:
scanf("%d", &element);
insert(&my_tree, element);
break;
case 2:
exit(0);
}
}
return 0;
}
server.c 文件
typedef struct node
{
int data;
struct node *left;
struct node *right;
} Node;
typedef struct tree
{
Node *root;
} Tree;
void initialize(Tree *tree)
{
tree = (Tree*)malloc(sizeof(Tree));
tree->root = NULL;
}
void insert(Tree *tree, int data)
{
Node *temp = (Node*)malloc(sizeof(Node));
temp->left = temp->right = NULL;
temp->data = data;
if(tree->root == NULL)
tree->root = temp;
else
{
Node *prev,*curr;
prev = NULL;
curr = tree->root;
while(curr != NULL)
{
if(temp->data < curr->data){
prev = curr;
curr = curr->left;
}
if(temp->data >curr->data){
prev = curr;
curr = curr->right;
}
}
if(temp->data < prev->data)
prev->left = temp;
if(temp->data > prev->data)
prev->right = temp;
}
}
解决方案
void initialize(Tree *tree)
{
tree = (Tree*)malloc(sizeof(Tree));
tree->root = NULL;
}
改成
void initialize(Tree *tree)
{
if (tree) {
tree->root = NULL;
}
}
当您为您分配内存时,tree
您将使其指向新的内存位置,因此您原来tree
的根节点将不会被初始化,NULL
并且您也会引入内存泄漏。
推荐阅读
- spring-boot - Spring-boot我如何使用球衣消费XML RPC服务器
- amazon-web-services - Amazon Lex:在 Lambda 初始化中使用委托将永远不会返回错误处理
- python - 如何创建包含 gpiozero 的可执行文件?
- javascript - React Drag and Drop 不起作用 - 使用先前值渲染两次组件
- python - 列表中重复次数最多的元素
- java - 如何让 Hashmap 为一个键分配多个值?
- python-3.x - 为什么使用 ipython3 或 sudo python3 导入不同?
- haskell - 在 Haskell 中展平任意深度的列表
- git - 如何将项目从 Windows 10 上的本地计算机推送到 github 存储库
- javascript - 如何在 React Native 中删除警告