bstsort.c
#include "header.h"
/*
I had to write my own string functions.
checkString = returns 1 if the strings are the same, 0 otherwise
checkGreaterString = returns 1 if arg1 comes before arg2, 0 otherwise
*/
//insert a node
int insertNode(struct NODE *root, char *compare, int cFlag)
{
// root node
//printf("root -> input : %s\n", root -> input);
//strings are the same
if(checkString(root->input, compare, cFlag))
{
//printf("same string\n");
root->isDuplicate++; // count as duplicate
//printf("root input %s and its duplicates is : %d\n", root->input, root->isDuplicate);
return 0;
}
//strings are different
else
{
int check = checkGreaterString(root->input, compare, cFlag);
//printf("check: %d\n", check);
//compare comes before root
if (check == 1)
{
// store compare at left node for root
if(root -> left == NULL){
struct NODE *tempNode = malloc(sizeof(*tempNode));
tempNode ->left = NULL;
tempNode -> right = NULL;
tempNode -> isDuplicate = 0;
tempNode -> input = compare; //give node input
root -> left = tempNode; //set left node for root
//printf("left node : %s\n", tempNode -> input);
//printf("left node duplicate : %d\n", tempNode->isDuplicate);
//printf("left nodes parent %s\n", root -> input);
return 0;
}
//left node is not empty, so insert node at that node
else
{
printf("root -> left -> input %s\n", root -> left -> input);
printf("compare : %s\n", compare);
insertNode(root -> left, compare, cFlag);
return 0;
}
}
//compare comes after root
else if(check == 0)
{
// store compare at right node for root
if(root -> right == NULL){
printf("im in the right node\n");
struct NODE *tempNode = malloc(sizeof(*tempNode));
tempNode ->left = NULL;
tempNode -> right = NULL;
tempNode -> isDuplicate = 0;
tempNode -> input = compare; //give node input
root -> right = tempNode; // set right node for root
//printf("right -> right -> input : %s\n", root -> right -> input);
//printf("root -> left -> input %s\n", root -> left -> input);
//printf("right node duplicate : %d\n", tempNode->isDuplicate);
//printf("right nodes parent %s\n", root -> input);
return 0;
}
////right node is not empty, so insert node at that node
else
{
//printf("im in the else for right node \n");
//printf("root->right->input%s\n", root -> right -> input);
insertNode(root -> right, compare, cFlag);
}
}
}
}
header.h
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <ctype.h>
#include <string.h>
struct NODE {
struct NODE *left;
struct NODE *right;
char *input;
int isDuplicate;
};
struct NODE root;
我正在尝试使用用户提供的输入创建二叉树。输入函数在另一个文件中,但它们都可以正常工作。我的问题是结构,或者更精确地设置结构的左右节点。每次我使用特定输入设置根的左/右节点时,输入会在没有明确更改的情况下更改。我认为问题出在我的tempNode
指针上,但我不确定是什么问题以及如何解决它。
以上是我上面谈到的问题的一个例子:
假设用户输入“for”。 “for”成为树的根
然后用户输入“吃”。 “ate”将成为根的左子女
****到此为止这是有效的。如果我打印我的根和左根节点的字符串,他们会给我正确的字符串*******
现在,用户输入“test”,“test”确实成为root的正确子项,但是现在当我打印左子时它也是“test”。根字符串仍然正确。
任何帮助将不胜感激。谢谢!
答案 0 :(得分:3)
问题可能在这里:
tempNode -> input = compare;
您让节点指向输入缓冲区,但在读取下一个输入时会被覆盖。 (除非您采取额外的预防措施以避免这种情况)。不是复制指针,而是分配内存来创建字符串的副本,让tempNode -> input
指向它。