Descripción sólo está imprimiendo para el último introducido

votos
1

Estoy bastante nuevo en C y estoy tratando de implementar un árbol binario en C que almacenará un número y una cadena y luego imprimirlos por ejemplo,

1 : Bread
2 : WashingUpLiquid
etc.

El código que tengo hasta ahora es:

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

Por el momento parece que funciona para los ints, pero la parte descriptiva sólo imprime hacia fuera para el último introducido. Asumo que tiene algo que ver con los punteros en la charmatriz, pero no he tenido suerte con su funcionamiento. Cualquier idea o consejo?

Publicado el 23/03/2010 a las 00:53
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
2

Siempre está haciendo un scanf en def y luego paso, que a su rutina de inserción que simplemente guarda el puntero para def. Por lo tanto, ya que todas las entradas apuntan a la memoria intermedia de definición, todos ellos apuntan a lo que fue la última cadena que almacenó en ese búfer.

Debe copiar la cadena y colocar un enlace a una copia en el nodo del árbol binario.

Respondida el 23/03/2010 a las 01:00
fuente por usuario

votos
1

El problema es que usted está utilizando el mismo tampón para la cadena. Tenga en cuenta que su estructura es la celebración de un puntero a un char, y que está pasando la misma matriz de caracteres como el puntero cada vez.

Cuando se llama scanfen la memoria intermedia, se cambian los datos que apunta, no el puntero en sí.

Para solucionar este problema, antes de asignarlo a una estructura, se puede utilizar strdup . Por lo que las líneas de código se convertirían

tmp_*->definition = strdup(word);

Tenga en cuenta que la matriz de caracteres devuelto por strdup debe ser liberada una vez que haya terminado con él, de lo contrario tendrá una fuga.

Respondida el 23/03/2010 a las 01:03
fuente por usuario

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