我一直在构建这个哈希表函数,它给出一个数组,它从中获取一个单词,以及一个指向它用我的链表结构填充的数组的指针。它编译正确,但我在 - *hashTable[hashVal] = *newNode; 处出现段错误.
void hashTableCreate(char *array, list *hashTable[]) {
while(arrayPos < getArrayLength(array)) {
char *temp = getWord(array);
int hashVal = hashingFunc(temp);
if((*hashTable[hashVal]).word == temp ) {
(*hashTable[hashVal]).count = (*hashTable[hashVal]).count+1;
}
else {
list *newNode = malloc(sizeof(list));
strcpy(newNode->word,temp);
newNode->count = 1;
*hashTable[hashVal] = *newNode;
}
}
}
它的名字是这样的:
void timeStructures(char *newArray) {
list *hashTable[3000];
hashTableCreate(newArray, hashTable);
}
我知道这与我使用指针的方式有关,但我无法弄清楚。任何帮助将不胜感激。
最佳答案
这段代码有几个问题:
- 您似乎在将
newNode
分配给hashTable
时使用了额外的星号。 - 您可以使用
++
运算符来增加count
,并使用->
来访问结构体指针的成员。< getWord
我不知道,但似乎不可能返回指向hashTable
元素中包含的字符串的指针,这意味着下一个if
将始终为 false(newNode
的word
是复制的字符串,而不是指向array
的 word 的指针),因为它比较内存地址而不是字符串。- 您从来没有释放过
temp
和hashTable
元素,这似乎是对您在这里所做的事情的另一个误解。 - 正如 @kaylum 所指出的,您应该初始化
hashTable
,这样就可以避免与未分配的数组元素进行比较,也不会修改它们的count
。 hashTable
必须作为指向hashTableCreate
的指针传递,否则这将在其复制版本上运行:
试试这个:
void hashTableCreate(char *array, list *(*hashTable[])) {
while(arrayPos < getArrayLength(array)) {
char *temp = getWord(array);
int hashVal = hashingFunc(temp);
if((*hashTable)[hashVal] != NULL &&
strcmp((*hashTable)[hashVal]->word, temp) == 0 ) {
(*hashTable)[hashVal]->count++;
}
else {
list *newNode = malloc(sizeof(list));
strcpy(newNode->word,temp);
newNode->count = 1;
(*hashTable)[hashVal] = newNode;
}
free(temp);
}
}
void timeStructures(char *newArray) {
list *hashTable[3000];
int i;
// Initialize hashTable pointers to NULL
for(i = 0; i < 3000; i++) {
hashTable[i] = NULL;
}
hashTableCreate(newArray, &hashTable);
// Free hashTable elements, malloc'ed at hashTableCreate
for(i = 0; i < 3000; i++) {
if(hashTable[i] != NULL) {
free(hashTable[i]);
}
}
}
注 1:你从不检查 hashVal
是否高于 3000,如果你知道自己在做什么,这可能没问题,也就是说,你知道 hashingFunc
永远不会返回3000或更高。如果不这样做,您需要适本地关注 hashTable
的增长。
注意 2:对于大型列表,在每个循环上执行 getArrayLength
可能会出现性能问题。您可能更喜欢创建一个变量来包含其值并仅执行一次。
注 3:如果将 hashTable
声明为普通的元素列表,而不是指向元素的指针列表,例如 list hashTable[3000];
,但我不知道你到底在找什么。此外,它总是会浪费 3000 个 list
元素的内存,因此可能会出现性能问题。
关于C:帮助理解指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33981871/