Beschrijving wordt enkel het afdrukken van de laatste kwam men in

stemmen
1

Ik ben vrij nieuw in C en ik ben op zoek naar een binaire boom in C, die een nummer en een string op te slaan en ze vervolgens afdrukken off bv uit te voeren

1 : Bread
2 : WashingUpLiquid
etc.

De code die ik tot nu toe 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);
  }
}

Op dit moment lijkt te werken voor de intjaren, maar de beschrijving deel drukt alleen uit voor de laatste ingevoerd. Ik neem aan dat het iets te maken heeft met aanwijzingen over de charserie, maar ik had geen geluk om het te laten werken. Enig idee of advies nodig?

De vraag is gesteld op 23/03/2010 om 00:53
bron van user
In andere talen...                            


2 antwoorden

stemmen
2

Je bent altijd bezig met een scanf in def en het vervolgens voeren die naar uw insert routine die net slaat de wijzer naar Def. Dus, omdat al uw gegevens wijzen op de def buffer, ze wijzen allemaal naar wat was de laatste reeks die u opgeslagen in die buffer.

U moet uw snaar te kopiëren en leg een verwijzing naar de kopie in de binaire boom node.

antwoordde op 23/03/2010 om 01:00
bron van user

stemmen
1

Het probleem is dat je met behulp van dezelfde buffer voor de string. Merk je structuur houdt een pointer naar een char, en je voorbij dezelfde array van karakters als die pointer elke keer.

Wanneer u belt scanfop de buffer, verandert u de gegevens die hij wijst op, niet de aanwijzer zelf.

Om dit te verhelpen, voordat het toewijzen van het aan een structuur, kunt u gebruik maken strdup . Dus de regels code zou worden

tmp_*->definition = strdup(word);

Houd in gedachten dat de array van karakters geretourneerd door strdup bevrijd moeten worden als je eenmaal klaar bent met het, anders krijg je een lek te hebben.

antwoordde op 23/03/2010 om 01:03
bron van user

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