2017-07-27 6 views
0

J'ai un projet qui est nécessaire pour stocker deux variables pour un arbre AVL: un mot et le taux qu'il est utilisé:Enregistrement d'une chaîne en C pour un arbre AVL

struct AVLnodo { 
    float peso; 
    int FB; 
    char *palavra; 
    struct AVLnodo* esq; 
    struct AVLnodo* dir; 
}; 

Note:

peso = taux d'utilisation

Palavra = mot

d'autres variables sont des pointeurs vers l'enfant et les facteurs d'équilibre.

Le problème se situe dans le code ci-dessous:

wordTree* InsereAVL (wordTree *a, float peso, char *word, int *ok) 
{ 
if (a == NULL) 
    { 
    a = (wordTree*) malloc(sizeof(wordTree)); 
    a->peso = peso; 
    a->palavra = NULL; 

    //1-----> strcpy(a->palavra,word); 
    //2-----> a->palavra=word; 

    a->esq = NULL; 
    a->dir = NULL; 
    a->FB = 0; 
    *ok = 1; 
} 
else 
if (peso < a->peso) 
{ 
     ... 
} 
else 
{ 
     ... 
} 
return a; 
} 

La bonne façon de copier la chaîne est d'utiliser le strcpy, comme le montre 1, mais qui se traduit par une erreur d'exécution. Lorsque vous utilisez 2, le code fonctionne, mais le champ de mot sur la structure de chaque nœud est stocké avec la même adresse, c'est-à-dire que tous les nœuds ont un nombre différent de peso (taux d'utilisation) mais le même mot sur palavra (mot), qui est le dernier mot ajouté à l'arbre.

Je ne sais pas comment résoudre ce problème. J'espère que quelqu'un saura comment y remédier.

Merci.

+1

'a-> palavra = NULL; strcpy (a-> palavra, mot), est mauvais. Il n'y a pas de mémoire allouée à 'a-> palavra'. Suggérer 'a-> palavra = strdup (mot);'. Vous êtes responsable de 'libérer (a-> palavra)' plus tard. –

+0

"La bonne façon de copier la chaîne est d'utiliser le strcpy" Oui, mais copiez-le * où *? Vous avez besoin de mémoire pour conserver la copie en premier, et elle ne pousse pas sur les arbres (AVL). –

+0

Je pensais que l'utilisation de 'a = (wordTree *) malloc (sizeof (wordTree));' allouerait aussi de la mémoire pour la chaîne, l'a corrigé maintenant. Merci –

Répondre

3

Vous devez allouer de la mémoire avant la copie mot:

a->palavra = malloc(strlen(word)+1);

+0

Je l'ai fait et ça a marché ! J'ai utilisé 'a = (wordTree *) malloc (sizeof (wordTree));' a pensé qu'il allouerait de la mémoire pour le champ de chaîne, merci pour l'aide! –

+0

'malloc (sizeof (wordTree));' alloue juste assez de mémoire pour votre struct. Les pointeurs représentent un type différent du type auquel ils se réfèrent. Notez que la taille du pointeur peut différer sur les architectures varios. –

1

Je pense que vous devez malloc la mémoire avant STRCPY à a->palavra.