Frage

Ich bin ganz neu in C und ich versuche, einen binären Baum in C zu implementieren, die eine Nummer und einen String gespeichert werden und drucken Sie sie dann aus z.

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 ints zu arbeiten, aber die Beschreibung Teil druckt nur für die letzten eingegeben werden. Ich gehe davon aus, es hat etwas mit Zeigern auf dem char Array zu tun, aber ich hatte kein Glück es an der Arbeit. Irgendwelche Ideen oder Ratschläge?

War es hilfreich?

Lösung

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 scanf auf dem Puffer aufrufen, werden Sie die Daten zu ändern verweist er 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.

Andere Tipps

Sie machen immer eine scanf in def und dann, dass auf Ihren Einsatz Routine vorbei, die nur den Zeiger sparen bis zu def. Also, da alle Ihre Eingaben zu Punkt der def Puffer, sie alle auf, was auch immer war die letzte Zeichenfolge, die Sie in diesem Puffer gespeichert.

Sie benötigen eine Zeichenfolge kopieren und einen Zeiger auf die Kopie in den binären Baumknoten setzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top