0

免責事項:これは宿題の問題です。当然のことながら、私はそれを自分で解決しようとしています。わからない問題が発生したようですので、よろしくお願いします。

単語のセットをハッシュし、それをリンクリストの配列に挿入する必要があります。したがって、3つの異なる単語にハッシュ38がある場合、array [38]に、3つの単語のリンクリストが必要です。

私はこの構造体を使用しています

struct Word {
    char* word;
    struct Word* next;
};

ハッシュした後、次のように配列に挿入します。

struct Word* table[1000];   // array of linked-lists

char word[128];
while(fgets(word, sizeof(word), dict) != NULL) {
    hashValue = hashWord(word, strlen(word));        

    struct Word *newWord = malloc(sizeof(struct Word));
    newWord->word = word;           

    if (table[hashValue] == NULL) {
        table[hashValue] = newWord;             
    } else {   // at index hashValue, table already contains at least one element
        // insert new word as first element of linked-list
        newWord->next = table[hashValue];
        table[hashValue] = newWord;         
    }

}

ハッシュが38の単語が約5つあることは知っていますが、それらを印刷すると、同じ単語が5回取得されます。

struct Word* foo = table[38];

while (foo->next != NULL) {
    printf("%s", foo->word); // prints the same word every time
    foo = foo->next;
}

ある時点でリンクリストを上書きしているようですが、どこにあるのかわかりません。

4

2 に答える 2

5
while(fgets(word, sizeof(word), dict) != NULL) {
    ...
    newWord->word = word;           

word問題は、すべてのに格納されているのと同じポインタである、の内容を置き換えることですnewWord

Word次の行を使用して、毎回ヒープに新しい構造を割り当てます。

struct Word *newWord = malloc(sizeof(struct Word));

ただし、これはWord構造自体にメモリを割り当てるだけです。Word構造には-char *wordつまり文字(この場合はNULで終了する文字列)へのポインタが含まれますが、実際には文字列自体のスペースは含まれません。

ここで、文字列に明示的にメモリを割り当てる必要があります。これを試して:

newWord->word = strdup(word);

これにより、のコピーwordWord構造に配置されます。このコピーは、ループfgets()でnextが呼び出されたときに上書きされません。whileスタックに割り当てられた文字配列を思い出してください。

char word[128];

この関数の実行中にのみ有効です。関数呼び出しを超えて存続させたい場合は、ヒープに何かを割り当てる必要があります(、、malloc()またはそれを使用するものなど)。strdup()

終了したら、それぞれを解放する前free()にsを忘れないでください。char *wordWord*

于 2012-07-19T04:06:20.637 に答える
1

単語配列を上書きしています。配列へのポインタのみを格納していますが、配列は新しい単語ごとに上書きされます。各単語を保持するには、個別のメモリが必要です。

于 2012-07-19T04:06:11.803 に答える