Beskrivelsen er bare å skrive ut for den siste kom inn

stemmer
1

Jeg er ganske ny på C, og jeg prøver å gjennomføre et binært tre i C som vil lagre et nummer og en streng og deretter skrive dem ut f.eks

1 : Bread
2 : WashingUpLiquid
etc.

Koden jeg har så langt er:

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

I øyeblikket ser det ut til å fungere for de ints men beskrivelsen delen skriver bare ut for den siste kom inn. Jeg antar det har noe å gjøre med pekere på charrekke, men jeg hadde ingen hell å få det til å fungere. Noen ideer eller råd?

Publisert på 22/03/2010 klokken 23:53
kilden bruker
På andre språk...                            


2 svar

stemmer
2

Du alltid gjør en scanf inn def og deretter passerer det til din innsats rutine som bare lagrer pekeren til def. Så, siden alle oppføringene peker til den def buffer, de alle peker på hva som var den siste strengen du lagret i denne buffer.

Du må kopiere strengen og plassere en peker til kopien inn i binærtreet node.

Svarte 23/03/2010 kl. 00:00
kilden bruker

stemmer
1

Problemet er at du bruker den samme buffer for strengen. Merker at struct holder en peker til en røye, og du passerer samme røye array som at pekeren hver gang.

Når du ringer scanfpå buffer, endrer du data den peker til, ikke pekeren selv.

For å fikse dette, før du tilordner den over til en struct, kan du bruke strdup . Slik at linjene med kode som skulle bli

tmp_*->definition = strdup(word);

Husk at røye matrisen som returneres av strdup må frigjøres når du er ferdig med det, ellers vil du ha en lekkasje.

Svarte 23/03/2010 kl. 00:03
kilden bruker

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