2017-07-27 1 views
0

Ich habe ein Projekt, das zwei Variablen für einen AVL-Baum zu speichern benötigt wird: ein Wort und die Geschwindigkeit, dass es verwendet wird:eine Zeichenfolge in C für einen AVL-Baum speichert

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

Hinweis:

Peso = Nutzungsrate

palavra = Wort

andere Variablen sind Hinweise auf das Gleichgewicht zwischen Kind und Faktor.

Das Problem ist in dem folgenden Code:

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

Der richtige Weg, um die Zeichenfolge zu kopieren ist, um die strcpy zu verwenden, wie durch 1 gezeigt wird, sondern dass in einem Ausführungsfehler resultiert.

Bei Verwendung von 2 funktioniert der Code, aber das Wortfeld auf der Struktur jedes Knotens wird mit der gleichen Adresse gespeichert, dh alle Knoten haben eine andere Nummer auf Peso (Rate of Use), aber dasselbe Wort auf Palavra (Wort), welches das letzte dem Baum hinzugefügte Wort ist.

Ich bin mir nicht sicher, wie man dieses Problem löst. Hoffentlich weiß jemand, wie man es repariert.

Danke.

+1

'a-> palavra = NULL; strcpy (a-> palavra, Wort); 'ist schlecht. Es ist kein Speicher für "a-> palavra" reserviert. Schlage 'a-> palavra = strdup (Wort);'. Sie sind dafür verantwortlich, später "a-> palavra" frei zu geben. –

+0

"Der richtige Weg, um die Zeichenfolge zu kopieren, ist die Verwendung der strcpy" Ja, aber kopieren Sie es * wo *? Sie benötigen Speicher, um die Kopie zuerst zu behalten, und sie wächst nicht auf (AVL) -Bäumen. –

+0

Ich dachte, dass die Verwendung von 'a = (wordTree *) malloc (sizeof (wordTree));' Speicher für die Zeichenfolge ebenfalls zuweisen würde, hat dies jetzt behoben. Thanks –

Antwort

3

Sie müssen vor dem Kopieren Wortspeicher zuweisen:

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

+0

Ich tat dies und es hat funktioniert ! Ich verwendete 'a = (wordTree *) malloc (sizeof (wordTree));' dachte, es würde Speicher für das string-Feld auch zuweisen, danke für die Hilfe! –

+0

'malloc (sizeof (wordTree));' weist nur genügend Speicher für Ihre Struktur zu. Zeiger repräsentieren einen anderen Typ als der Typ, auf den sie sich beziehen. Beachten Sie, dass die Zeigergröße bei verschiedenen Architekturen unterschiedlich sein kann. –

1

Ich glaube, Sie müssen den Speicher malloc, bevor Sie zu a->palavra strcpy.

Verwandte Themen