Açıklama yalnızca sonuncusu girilen için dışarı yazdırıyor

oy
1

Ben C için oldukça yeni ve bir sayı ve bir dize depolamak ve daha sonra örneğin onları yazdırır C bir ikili ağacı uygulamak çalışıyorum

1 : Bread
2 : WashingUpLiquid
etc.

Bugüne kadar sahip kodudur:

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

Şu anda için çalışmak gibi ints ancak açıklama kısmı sadece girilen sonuncusu için dışarı yazdırır. Bunun üzerine işaretçiler ile ilgili bir şey vardır varsayalım chardizinin ama işe alma şansı olmadığını. Herhangi bir fikir veya tavsiye?

Oluştur 23/03/2010 saat 00:53
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
2

Her zaman def içine scanf yapıyor ve sonra sadece def işaretçisi kaydeder insert rutin olduğunu geçiyoruz. Yani, beri girişlerinin tümünü o tampon saklanan son dize oldu hepsi noktası ne olursa olsun, def tampon işaret ediyor.

Sen ikili ağaç düğümü içine kopyasına bir işaretçi sizin dize kopyalayıp yerleştirmek gerekir.

Cevap 23/03/2010 saat 01:00
kaynak kullanıcı

oy
1

Sorun dize için aynı tampon kullanılarak olmamız. senin yapı bir char bir işaretçi tutan ve söz konusu işaretçi olarak her zaman aynı karakter dizisi geçiyoruz dikkat edin.

Aradığınızda scanftampon üzerinde, bunun pointer kendisi değil, işaret verileri değişiyor.

Bir yapı için ters atamadan önce, Bunu düzeltmek için kullanabileceğiniz strdup . Yani kod satırları olacaktı

tmp_*->definition = strdup(word);

aksi takdirde bir sızıntı olur, onunla bir kez yapılır strdup tarafından döndürülen karakter dizisi serbest bırakılmalı unutmayın.

Cevap 23/03/2010 saat 01:03
kaynak kullanıcı

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