Beschreibung ist nur der Ausdruck für die letzte eintreten

stimmen
1

Ich bin ganz neu in C und ich versuche, einen binären Baum in C zu implementieren, die eine Nummer und eine Zeichenfolge speichern und sich dann aus drucken zB

1 : Bread
2 : WashingUpLiquid
etc.

Der Code, den ich bisher habe, ist:

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

Im Moment scheint es für die Arbeit ints aber die Beschreibung Teil druckt nur aus für die letzten eingetragen. Ich gehe davon aus, es hat etwas mit Zeigern auf dem zu tun charArray , aber ich hatte kein Glück bekommen sie zu arbeiten. Irgendwelche Ideen oder Beratung?

Veröffentlicht am 23/03/2010 um 00:53
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
2

Du bist immer ein scanf in def tun und dann die Routine zu Ihrem Einsatz vorbei, die nur den Zeiger spart bis def. Also, da alle Ihre Einträge verweisen auf die def-Puffer, sie alle auf, was auch immer war die letzte Zeichenfolge, die Sie in diesem Puffer gespeichert.

Sie benötigen eine Zeichenfolge und legen Sie einen Zeiger auf die Kopie in den binären Baum Knoten zu kopieren.

Beantwortet am 23/03/2010 um 01:00
quelle vom benutzer

stimmen
1

Das Problem ist, dass Sie den gleichen Puffer für die Zeichenfolge verwenden. Beachten Sie Ihre Struktur ist einen Zeiger auf ein Zeichen zu halten, und Sie übergeben den gleichen char-Array wie die Zeiger jedes Mal.

Wenn Sie rufen scanfauf den Puffer, ändern Sie die Daten , die er zeigt auf, nicht der Zeiger selbst.

Um dies zu beheben, bevor sie über zu einer Struktur zuordnen, können Sie verwenden strdup . So sind die Codezeilen würde

tmp_*->definition = strdup(word);

Beachten Sie, dass die char-Array von strdup zurückgegeben wird, muss befreit werden, sobald Sie damit fertig sind, sonst werden Sie ein Leck haben.

Beantwortet am 23/03/2010 um 01:03
quelle vom benutzer

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