2014-04-01 20 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