gpt4 book ai didi

c - 使用 while 循环插入节点时,二叉搜索树插入不起作用

转载 作者:行者123 更新时间:2023-11-30 20:26:41 26 4
gpt4 key购买 nike

我已经在 ideone 上发布了我的 BST 代码的链接:http://ideone.com/P7850n

在主函数中,当我读取 while 循环中的值并将其插入 BST 时,出现错误,但如果我使用 for 循环,则效果很好。对于仅在 while 循环中发生的此错误的可能解释是什么?

#include <stdio.h>
#include <stdlib.h>

//data struct for BST node
typedef struct BST
{
int data;
struct BST *left;
struct BST *right;
}node;

//make node from given data
node* makeNode(int data)
{
node *n=(node*)malloc(sizeof(node));
n->data=data;
n->left=NULL;
n->right=NULL;

return n;
}

//insert node in BST
node* insert(node* root,int key)
{
if(root==NULL)
return makeNode(key);

if(key < root->data)
root->left=insert(root->left,key);
else
root->right=insert(root->right,key);

return root;
}

//inorder printing prints in sorted order
void inorder(node* root)
{
if(root==NULL)
return;

inorder(root->left);
printf("%d ",root->data);
inorder(root->right);
}

//driver function
int main(void) {
// your code goes here
node *root;
int s,i,key;
scanf("%d",&s);
while(s--)
//for(i=0;i<s;i++)
{
scanf("%d",&key);
root=insert(root,key);
}
inorder(root);
return 0;
}

最佳答案

这很可能是一个未初始化的变量root

编译器会在不再需要变量后重新使用相同的内存来存储变量(无论是在程序中声明还是在内部使用),以便其他变量稍后占用相同的内存。在 C 中(与 Perl 不同),当内存分配给变量时,它不会自动清除:您应该自己执行此操作,这称为初始化:通常,一旦声明变量,就应该为其分配一些值:int 年 = 2014 年;。如果在给变量赋值之前使用它,那么它的值将是它占用的内存中的任何值,其他变量甚至其他正在运行的程序留下的值。

在您的情况下,当您使用 i=0 初始化 for 循环时,这个 0 可能会使用稍后用于 root 的内存,所以一不小心它就起作用了。当您使用非零 s 初始化 while 循环时,root 使用恰好非零的内存。

解决方案是初始化root = NULL;,一般来说,始终初始化所有变量是一个好习惯。

关于c - 使用 while 循环插入节点时,二叉搜索树插入不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24730712/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com