我当前正在从事课程的编程分配。我的功能之一中有一个SEG错误,无法源于问题的根源。我已经尽力了,发现seg故障发生在" if(myNode-> key == key)"中。任何明智的话都会有所帮助!
struct node*searchForPerson(const char *value){
int key=convertToKey(value);
struct node *myNode;
int i=0;
int j = (key % 8)+(i*(key%5));
while (i < size - 1 && hashTable[j].head != NULL && hashTable[j].index != key ) {
i++;
j=(key % 8)+(i*(key%5));
}
myNode=hashTable[j].head;
if(myNode->key==key) {
printf(" foundn");
return myNode;
}
else{
printf("not foundn");
return NULL;
}
}
我认为问题的根可能是我对哈希函数的插入:
void insertToHash(int key, char *value){
int i = 0;
int j = (key % 8)+(i*(key%5));
struct node *newnode = createNode(key, value);
/*head of list for the bucket with index "hashIndex"*/
if (!hashTable[j].head) {
hashTable[j].head = newnode;
hashTable[j].count=1;
return;
}
while (i < size - 1 && hashTable[j].head != NULL) {
i++;
j=(key % 8)+(i*(key%5));
}
//adding new node to the list
hashTable[j].head=newnode;
hashTable[j].count++;
return;
hashTable[j].head = newnode;
hashTable[j].count++;
}
您应该添加一个if语句,以确保 hashTable[j].head
不是 NULL
。
请记住,您的循环条件为3个条件,因此,如果其中任何一个变为false,则循环将退出。特别是,在循环后立即您不知道它是否退出,因为
-
i
现在大于或等于size - 1
-
hashTable[j].head
现在等于NULL
-
hashTable[j].index
现在等于key
如果情况为(2),则myNode
将为NULL
,因此myNode->key
将删除一个空指针,从而导致Segfault。