gpt4 book ai didi

c - C中的BST-仅写入根目录

转载 作者:行者123 更新时间:2023-11-30 19:32:08 27 4
gpt4 key购买 nike

对于我不知道原因的问题,我需要帮助。
下面是我的代码。它只写根索引,仅此而已。根的左右指针仍然为空。但是我分配了内存并将字符串复制到它的索引中。

typedef struct bst {
char index[128];
struct bst *left;
struct bst *right;
}bst;

int main(void)
{
bst *root = malloc (sizeof(bst));
root->left = NULL;
root->right = NULL;
strcpy(root->index, "indexisnull");

bst *temp;
temp = root;

FILE *fp, *fp2; //file pointers
char word[128];

fp = fopen("Input1.txt", "r"); //opening text files in read mode
fp2 = fopen("Input2.txt", "r");

while(fscanf(fp,"%s", word) == 1)
{
//getting strings from file to string 'word'

temp = root;

if(strcmp(root->index, "indexisnull") == 0)
{
strcpy(root->index, word);
}

if(strcmp(word, root->index) < 0)
{
//temp = temp->left;
while(temp != NULL)
{
if(strcmp(word, temp->index) < 0)
{
printf("lefttoleft\n");
temp = temp->left;
}
else if(strcmp(word, temp->index) > 0)
{
temp = temp->right;
printf("lefttoright\n");
}
}
temp = malloc(sizeof(bst));
strcpy(temp->index, word);
temp->left = NULL;
temp->right = NULL;
}
else if(strcmp(word, root->index) > 0)
{
temp = temp->right;
while(temp != NULL)
{
if(strcmp(word, temp->index) < 0)
{
temp = temp->left;
printf("righttoleft\n");
}
else if(strcmp(word, temp->index) > 0)
{
temp = temp->right;
printf("righttoright\n");
}
}
temp = malloc(sizeof(bst));
strcpy(temp->index, word);
temp->left = NULL;
temp->right = NULL;
}
}

temp = root;
printf("%s\n", temp->index);
printf("%s\n", temp->right->index);
printf("%s\n", temp->left->index);

fclose(fp); //closing files
fclose(fp2);
return 0;
}

最佳答案

我建议使用gdb来了解您的方法是如何遍历树的。在线有大量信息可用于调试程序。尝试在主步进和单步步进中设置断点,以便可以打印temp的内存地址。

我认为您没有为想要的新bst节点分配内存。当您只有一个根节点时,temp等于什么?根节点需要引用新分配的节点:

if(strcmp(word, temp->index) < 0) {
printf("lefttoleft\n");
temp->left = malloc(sizeof(bst));
temp = temp->left;
strcpy(temp->index, word);
temp->left = NULL;
temp->right = NULL;
}
else if(strcmp(word, temp->index) > 0) {
temp->right = malloc(sizeof(bst));
temp = temp->right;
strcpy(temp->index, word);
temp->left = NULL;
temp->right = NULL;
printf("lefttoright\n");
}


通过在temp-> left或temp-> right进行分配,父节点将存储引用。

至于找到放置节点的适当位置(我给的结果不会找到一个空的子节点,它只会存储为左子节点或右子节点),您可以单独跟踪父节点或检查左/右引用是否为空在插入之前。

关于c - C中的BST-仅写入根目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47392665/

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