Описание только распечатав за один последний Поступил

голоса
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);
  }
}

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

Задан 23/03/2010 в 00:53
источник пользователем
На других языках...                            


2 ответов

голоса
2

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

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

Ответил 23/03/2010 в 01:00
источник пользователем

голоса
1

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

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

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

tmp_*->definition = strdup(word);

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

Ответил 23/03/2010 в 01:03
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more