Description est l'impression que pour le dernier est entré

voix
1

Je suis tout à fait nouveau pour C et je suis en train de mettre en œuvre un arbre binaire en C qui permet de stocker un nombre et une chaîne, puis les imprimer par exemple

1 : Bread
2 : WashingUpLiquid
etc.

Le code que j'ai à ce jour est le suivant:

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

À l'heure actuelle , il semble fonctionner pour les ints , mais la partie de la description imprime uniquement pour la dernière entrée. Je suppose qu'il a quelque chose à voir avec des pointeurs sur le chartableau , mais je n'avais pas de chance à le faire fonctionner. Des idées ou des conseils?

Créé 23/03/2010 à 00:53
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
2

Vous êtes toujours faire un scanf en def et en passant ensuite que votre routine d'insertion qui permet de gagner juste le pointeur vers def. Ainsi, étant donné que toutes vos entrées pointent vers la mémoire tampon def, ils pointent tous vers ce qui était la dernière chaîne que vous avez enregistré dans ce tampon.

Vous devez copier votre chaîne et placez un pointeur sur la copie dans le nœud de l'arbre binaire.

Créé 23/03/2010 à 01:00
source utilisateur

voix
1

Le problème est que vous utilisez le même tampon pour la chaîne. Notez votre struct tient un pointeur sur un char, et vous passez le même tableau de caractères que ce pointeur à chaque fois.

Lorsque vous appelez scanfle tampon, vous modifiez les données qu'il fait, et non pas le pointeur lui - même.

Pour résoudre ce problème, avant de l' assigner à un sur struct, vous pouvez utiliser strdup . Ainsi , les lignes de code deviendraient

tmp_*->definition = strdup(word);

Gardez à l'esprit que le tableau de caractères retourné par strdup doit être libéré une fois que vous avez fini avec elle, sinon vous aurez une fuite.

Créé 23/03/2010 à 01:03
source utilisateur

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