1

我对 C 很陌生,我正在尝试在 C 中实现一个二叉树,它将存储一个数字和一个字符串,然后将它们打印出来,例如

1 : Bread
2 : WashingUpLiquid
etc.

我到目前为止的代码是:

#include <stdio.h>
#include <stdlib.h>
#define LENGTH 300

struct node {
 int data;
 char * definition;
 struct node *left;
 struct node *right;
};

struct node *node_insert(struct node *p, int value, char * word);

void print_preorder(struct node *p);

int main(void) {
  int i = 0;
  int d = 0;
  char def[LENGTH];
  struct node *root = NULL; 

  for(i = 0; i < 2; i++)
  {
    printf("Please enter a number: \n");
    scanf("%d", &d);
    printf("Please enter a definition for this word:\n");
    scanf("%s", def);
    root = node_insert(root, d, def);
    printf("%s\n", def);
  }

  printf("preorder : ");
  print_preorder(root);
  printf("\n");

  return 0;
}

struct node *node_insert(struct node *p, int value, char * word) {
  struct node *tmp_one = NULL;
  struct node *tmp_two = NULL;

  if(p == NULL) {
    p = (struct node *)malloc(sizeof(struct node));
    p->data = value;
    p->definition = word;
    p->left = p->right = NULL;
  }
  else {
    tmp_one = p;
    while(tmp_one != NULL) {
      tmp_two = tmp_one;
      if(tmp_one->data > value)
        tmp_one = tmp_one->left;
      else
        tmp_one = tmp_one->right;
    }

    if(tmp_two->data > value) {
      tmp_two->left = (struct node *)malloc(sizeof(struct node));
      tmp_two = tmp_two->left;
      tmp_two->data = value;
      tmp_two->definition = word;
      tmp_two->left = tmp_two->right = NULL;
    }
    else {
      tmp_two->right = (struct node *)malloc(sizeof(struct node)); 
      tmp_two = tmp_two->right;
      tmp_two->data = value;
      tmp_two->definition = word;
      tmp_two->left = tmp_two->right = NULL;
    }
  }

  return(p);
}

void print_preorder(struct node *p) {
  if(p != NULL) {
    printf("%d : %s\n", p->data, p->definition);
    print_preorder(p->left);
    print_preorder(p->right);
  }
}

目前它似乎适用于ints 但描述部分仅打印出最后输入的内容。我认为它与char数组上的指针有关,但我没有运气让它工作。有什么想法或建议吗?

4

2 回答 2

2

您总是在 def 中执行 scanf,然后将其传递给您的插入例程,该例程只是保存指向 def 的指针。因此,由于您的所有条目都指向 def 缓冲区,因此它们都指向您存储在该缓冲区中的最后一个字符串。

您需要复制字符串并将指向副本的指针放入二叉树节点。

于 2010-03-23T00:00:54.350 回答
1

The problem is that you're using the same buffer for the string. Notice your struct is holding a pointer to a char, and you are passing the same char array as that pointer each time.

When you call scanf on the buffer, you are changing the data it points to, not the pointer itself.

To fix this, before assigning it over to a struct, you can use strdup. So the lines of code would become

tmp_*->definition = strdup(word);

Keep in mind that the char array returned by strdup must be freed once you are done with it, otherwise you'll have a leak.

于 2010-03-23T00:03:47.920 回答