2014-04-01 56 views
0

混淆了爲什麼我的哈希表結構表現得如此。結構行爲

我的結構:

typedef struct words { 
    const char *word; 
    int hitCount; 
} words; 

我採取一個字從一個文檔,並生成一個散列值,使用線性探測的碰撞。如果找到相同的單詞我hitCount ++否則我找到空間並覆蓋表中的空結構。

這裏是我的方法來做到這一點:

void add (char *inputWord, int index, int tableLength) { 
    while (hashTable[index].word != "0") { 
     if (strcmp(hashTable[index].word, inputWord) == 0) { 
      hashTable[index].hitCount++; 
      break; 
     } else { 
      index = ++index % tableLength; 
     } 
    } 
    if (hashTable[index].word == "0") { 
     hashTable[index].word = inputWord; 
     hashTable[index].hitCount++; 
    } 
} 

到目前爲止,我已經與包含15X 「測試」 和3X 「你好」 一個簡單的.txt測試它:

Test Test Test 
Test Test Test 
Test Test Test 
Test Test Test 
Test Test Test 
Hello Hello Hello 

和它輸出的情況如下:

hello:15 
hello:3 

而不是預期的:

test:15 
hello:3 

由於某些原因,我看不到它會覆蓋保存在表格相應位置的「測試」。

使用printf()表明,只要它添加第一個「hello」,即使正確的索引正在被解析爲add()並且它與「test」的不同,它也會擦除「測試」。

我希望我已經包含了不正確的代碼的來源,我已經提供了足夠的信息。

謝謝!

PS:(是不是在字母表一切都被剝離,解決方案必須在C)

回答

2

你是不是抄襲inputWord,您存儲的指針,它包含在內存 所以當你掃描下一個單詞時,內存會改變。所有的表格條目最終都會指向同一個單詞。

你需要做一個ht[index].word = strdup(inputWord);或類似的東西。

+0

那我該怎麼辦?我明白你的意思,但我的經驗大部分是在java中,所以我的意思是將輸入字符串存儲在給定索引的結構中。 – macourtney7

+0

使用strcpy()或類似的東西將內存複製到您的結構中,而不是像您當前正在執行的那樣僅將指針存儲到字符串中。 – John

+0

'strdup',將分配空間,複製字符串並返回指向新副本的指針。當你完成這個任務時,一定要「釋放」表中的所有「單詞」。 – AShelly