Descrierea este doar imprimând pentru ultima ENTERED

voturi
1

Sunt destul de nou la C și am încercat să pună în aplicare un arbore binar în C, care va stoca un număr și un șir și apoi imprimați-le de pe ex

1 : Bread
2 : WashingUpLiquid
etc.

Codul am până acum este:

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

În momentul de față pare să lucreze pentru ints , dar partea descriere imprimă doar pentru ultima intrat. Presupun că are ceva de- a face cu indicii pe charmatrice , dar am avut nici noroc obtinerea - l la locul de muncă. Orice idei sau sfaturi?

Întrebat 23/03/2010 la 00:53
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
2

Tu faci întotdeauna un scanf în def și apoi trece că pentru a insera rutina care salvează doar indicatorul la def. Deci, din moment ce toate intrările dvs. indică buffer-def, toate punct la orice ar fi fost ultima șirul stocat în acel tampon.

Ai nevoie să copiați șirul și plasați un pointer la copia în nodul arbore binar.

Publicat 23/03/2010 la 01:00
sursa de către utilizator

voturi
1

Problema este că utilizați același tampon pentru șirul. Observați struct dvs. deține un pointer la un char, și trec aceeași matrice char ca și indicator de fiecare dată.

Când apelați scanfpe tamponul, vi se schimbă datele pe care le indică, nu indicatorul în sine.

Pentru a remedia acest lucru, înainte de a atribui - l la un struct, puteți utiliza strdup . Deci , liniile de cod ar deveni

tmp_*->definition = strdup(word);

Rețineți că matrice char returnat de strdup trebuie să fie eliberat odată ce ați terminat cu ea, altfel veți avea o scurgere.

Publicat 23/03/2010 la 01:03
sursa de către utilizator

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