2017-07-27 57 views
0

我有一個需要存儲兩個變量的AVL樹的一個項目:一個字和速度,它被用於:存儲在C字符串AVL樹

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

注:

比索=使用的速率

palavra =字

其他變量是指向兒童和因素的平衡。

的問題是在下面的代碼:

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

複製串正確的方法是使用strcpy的,如圖1,但即導致執行錯誤。

使用2時,代碼有效,但每個節點的結構中的字段存儲的地址相同,即所有節點的peso(使用率)都有不同的數字,但palavra上的同一個字(單詞),這是添加到樹中的最後一個單詞。

我不知道如何解決這個問題。希望有人會知道如何解決它。

謝謝。

+1

'a-> palavra = NULL; strcpy(a-> palavra,單詞);'不好。沒有內存分配給'a-> palavra'。建議'a-> palavra = strdup(word);'。你有責任在以後免費(a-> palavra)。 –

+0

「複製字符串的正確方法是使用strcpy」是的,但複製它*其中*?您需要內存來保留副本,並且它不會在(AVL)樹上增長。 –

+0

我認爲使用'a =(wordTree *)malloc(sizeof(wordTree));'會爲該字符串分配內存,現在確實解決了這個問題。 謝謝 –

回答

3

你需要複製的字之前分配內存:

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

+0

我做到了這一點,它的工作原理! 我用過 'a =(wordTree *)malloc(sizeof(wordTree));' 以爲它會爲字符串字段分配內存,謝謝您的幫助! –

+0

'malloc(sizeof(wordTree));'只爲你的結構分配足夠的內存。指針表示與它們指向的類型不同的類型。請注意,varios體系結構上的指針大小可能不同。 –

1

我想你需要你的strcpy到a->palavra之前的malloc內存。