Περιγραφή μόνο την εκτύπωση για την τελευταία εισήλθε

ψήφοι
1

Είμαι αρκετά νέος σε C και εγώ προσπαθώ να εφαρμόσει ένα δυαδικό δέντρο σε C που θα αποθηκεύσετε έναν αριθμό και μια σειρά και στη συνέχεια να τις εκτυπώσετε από π.χ.

1 : Bread
2 : WashingUpLiquid
etc.

Ο κώδικας που έχω μέχρι στιγμής είναι:

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

Προς το παρόν φαίνεται να δουλεύει για τους ints, αλλά το τμήμα περιγραφή εκτυπώνει μόνο για το τελευταίο άρχισε. Υποθέτω ότι έχει να κάνει με δείκτες για τη charσειρά, αλλά δεν είχα την τύχη να μπορεί να λειτουργήσει. Οποιεσδήποτε ιδέες ή συμβουλές;

Δημοσιεύθηκε 23/03/2010 στις 00:53
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
2

Είσαι πάντα κάνει μια scanf σε def και, στη συνέχεια, παρεμπιπτόντως ότι για να ένθετο ρουτίνα σας, το οποίο αποθηκεύει μόνο το δείκτη να def. Έτσι, από το σύνολο των εγγραφών σας δείχνουν το ρυθμιστικό def, που όλα δείχνουν ό, τι ήταν η τελευταία κλωστή που είναι αποθηκευμένα σε αυτό το ρυθμιστικό.

Θα πρέπει να αντιγράψετε εγχόρδων σας και τοποθετήστε ένα δείκτη προς το αντίγραφο στο δυαδικό κόμβο του δένδρου.

Απαντήθηκε 23/03/2010 στις 01:00
πηγή χρήστη

ψήφοι
1

Το πρόβλημα είναι ότι χρησιμοποιείτε το ίδιο ρυθμιστικό για την εγχόρδων. Ανακοίνωση struct σας κρατά ένα δείκτη σε μια χαρα, και περνάτε την ίδια σειρά char όπως εκείνη του δείκτη κάθε φορά.

Όταν καλείτε scanfστο buffer, που αλλάζουν τα δεδομένα που δείχνει, δεν είναι το ίδιο το δείκτη.

Για να το διορθώσετε αυτό, πριν αναθέσουν πάνω σε ένα struct, μπορείτε να χρησιμοποιήσετε strdup . Έτσι, οι γραμμές κώδικα θα γίνει

tmp_*->definition = strdup(word);

Λάβετε υπόψη ότι η σειρά char επέστρεψε από strdup πρέπει να απελευθερωθεί μόλις τελειώσετε με αυτό, αλλιώς θα έχετε μια διαρροή.

Απαντήθηκε 23/03/2010 στις 01:03
πηγή χρήστη

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