Opis drukuje tylko na ostatni wpisany

głosy
1

Jestem całkiem nowe do C i próbuję wdrożyć binarne drzewo w C, która będzie przechowywać numer i ciąg, a następnie wydrukować je np

1 : Bread
2 : WashingUpLiquid
etc.

Kod mam tak daleko jest:

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

W tej chwili wydaje się działać na ints ale część opis drukuje tylko na ostatni wpisany. Przypuszczam, że to ma coś wspólnego ze wskaźników na chartablicy, ale nie miałem szczęścia uzyskiwanie go do pracy. Wszelkie pomysły lub rady?

Utwórz 23/03/2010 o 00:53
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
2

Ty zawsze robi scanf do def a następnie przechodząc do rutynowych że wkładki, który właśnie zapisuje wskaźnik do def. Tak, ponieważ wszystkie swoje wpisy wskazują na bufor def, ale wszystko wskazuje na cokolwiek był ostatni ciąg została zapisana w tym buforze.

Trzeba skopiować ciąg i umieścić wskaźnik do kopiowania do węzła drzewa binarnego.

Odpowiedział 23/03/2010 o 01:00
źródło użytkownik

głosy
1

Problem polega na tym, że używasz tego samego bufora ciągu. Zauważysz struct trzyma wskaźnik do char, a przechodzą taką samą tablicę char jako tego wskaźnika za każdym razem.

Podczas rozmowy telefonicznej scanfna buforze, to są zmiany danych wskazuje na to, a nie samego wskaźnika.

Aby rozwiązać ten problem, przed przypisaniem go do struktury, można użyć strdup . Więc linie kodu staną

tmp_*->definition = strdup(word);

Należy mieć na uwadze, że tablica char zwrócony przez strdup musi być zwolniona po zakończeniu z nim, inaczej będziesz mieć przeciek.

Odpowiedział 23/03/2010 o 01:03
źródło użytkownik

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