Описание распечатывается только для последнего введенного - PullRequest
1 голос
/ 23 марта 2010

Я довольно новичок в C и пытаюсь реализовать двоичное дерево в C, которое будет хранить число и строку, а затем распечатывать их, например:

1 : Bread
2 : WashingUpLiquid
etc.

Код, который у меняfar is:

#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);
  }
}

В данный момент кажется, что это работает для int s, но часть описания печатается только для последней введенной.Я предполагаю, что это как-то связано с указателями на массиве char, но мне не повезло заставить его работать.Любые идеи или советы?

Ответы [ 2 ]

2 голосов
/ 23 марта 2010

Вы всегда выполняете сканирование в def, а затем передаете его в свою процедуру вставки, которая просто сохраняет указатель в def.Итак, поскольку все ваши записи указывают на буфер def, все они указывают на то, какой последней строкой вы сохранили в этом буфере.

Вам необходимо скопировать строку и поместить указатель на копию в двоичный файлузел дерева.

1 голос
/ 23 марта 2010

Проблема в том, что вы используете один и тот же буфер для строки. Обратите внимание, что ваша структура содержит указатель на символ, и вы каждый раз передаете один и тот же массив символов с этим указателем.

Когда вы вызываете scanf в буфере, вы изменяете данные, на которые он указывает, а не сам указатель.

Чтобы исправить это, перед присвоением его структуре, вы можете использовать strdup . Таким образом, строки кода станут

tmp_*->definition = strdup(word);

Имейте в виду, что массив char, возвращаемый strdup, должен быть освобожден, как только вы закончите с ним, иначе у вас будет утечка.

...