结构本身正在改变价值观?

时间:2017-03-03 06:01:13

标签: c

  

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”。根字符串仍然正确。

任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:3)

问题可能在这里:

tempNode -> input = compare;

您让节点指向输入缓冲区,但在读取下一个输入时会被覆盖。 (除非您采取额外的预防措施以避免这种情况)。不是复制指针,而是分配内存来创建字符串的副本,让tempNode -> input指向它。