Popis tiskne pouze za poslední vložené

hlasů
1

Jsem na C zcela nový a já se snažím implementovat binární strom v C, která bude ukládat číslo a řetězec a vytisknout je pryč např

1 : Bread
2 : WashingUpLiquid
etc.

Kód jsem doposud je:

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

V tuto chvíli se zdá, že pracovat pro intsa ale popis část tiskne pouze pro poslední zadanou. Předpokládám, že to má co do činění s ukazateli na charpoli, ale neměl jsem štěstí dostat se do práce. Nějaké nápady či radu?

Položena 23/03/2010 v 00:53
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
2

Pořád dělá scanf do def a pak předá že do svého vložky rutiny, které právě ukládá ukazatel na Def. Takže, protože všechny vaše záznamy poukazují na def vyrovnávací paměti, že to vše ukazuje na vše, co bylo poslední řetězec, který uloží do této vyrovnávací paměti.

Musíte zkopírovat řetězec a umístěte ukazatel na kopii do binárního stromu uzel.

Odpovězeno 23/03/2010 v 01:00
zdroj uživatelem

hlasů
1

Problém je v tom, že používáte stejný buffer pro řetězec. Všimněte si, váš struct drží ukazatel na char, a ty procházejí stejnou char pole as tímto ukazatelem pokaždé.

Voláte-li scanfna paměti, měníte data, která odkazuje, ale nikoliv samotné ukazatele.

Chcete-li tento problém odstranit, před přiřazením se k struct, můžete použít StrDup . Takže řádků kódu by se stal

tmp_*->definition = strdup(word);

Mějte na paměti, že char array vrácené StrDup musí být uvolněn, jakmile jste udělal s ním, jinak budete muset únik.

Odpovězeno 23/03/2010 v 01:03
zdroj uživatelem

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