2010-03-22 5 views
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); 
    } 
} 

На данный момент, кажется, работает для int с, но описание часть печатает только за последний вошел. Я предполагаю, что это имеет какое-то отношение к указателям на массиве char, но мне не удавалось заставить его работать. Любые идеи или советы?

ответ

1

Проблема в том, что вы используете тот же буфер для строки. Обратите внимание, что ваша структура удерживает указатель на символ, и вы каждый раз передаете тот же массив символов, что и этот указатель.

Когда вы вызываете scanf в буфер, вы меняете данные, на которые указывает, а не указатель.

Чтобы исправить это, прежде чем назначать его структуре, вы можете использовать strdup. Таким образом, строки кода станет

tmp_*->definition = strdup(word); 

Имейте в виду, что массив символов, возвращаемый strdup должен быть освобожден, как только вы сделали с ним, в противном случае вы будете иметь утечку.

+0

Thats done it :) Спасибо большое, ребята, меня действительно раздражало! – Paul

+0

Теперь вы должны выбрать ответ, чтобы принять его, нажав зеленый галочку рядом с ним. Это говорит системе, что на этот вопрос дан ответ, а также дает ответчику и вам известную репутацию. –

2

Вы всегда делаете scanf в def, а затем передаете его в свою процедуру вставки, которая просто сохраняет указатель на def. Итак, поскольку все ваши записи указывают на буфер def, все они указывают на то, что было последней строкой, которую вы сохранили в этом буфере.

Вам необходимо скопировать строку и поместить указатель на копию в узел двоичного дерева.

Смежные вопросы