2017-07-27 52 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内存。