我已经成功地在每个插槽中创建了一个带有链接和单链表的哈希映射。当我使用insert时,它将新节点发送到每个链表的后面,但是我需要在插入新节点时对每个插槽进行排序。如何编辑以下insert
函数,以便不必在之后对每个插槽进行排序,而是将其插入正确的位置以开始?
void hashInsert(int key){
int hashLoc = h(key);
HashNode* prev = NULL;
HashNode* entry = hTable[hashLoc];
while(entry != NULL){
prev = entry;
entry = entry->next;
}
if(entry == NULL){
entry = new HashNode(key);
if(prev == NULL){
hTable[hashLoc] = entry;
}
else{
prev->next = entry;
}
}
else{
entry->value = key;
}
}
答案 0 :(得分:0)
保持每个插槽排序的主要技巧是插入正确的位置,在这种情况下,它将在第一个较大的值之前。
在您的代码中,您使用以下while循环强制插入列表的末尾。
while(entry != NULL){
prev = entry;
entry = entry->next;
}
相反,我们想要修改这个条件,这样我们就可以寻找更大的值,而不是简单地查找列表的末尾(entry == NULL)。
while(entry != NULL && entry->value < value_to_insert){
prev = entry;
entry = entry->next;
}
此修改后的for循环正确指出了正确放置新条目的位置,正好位于prev
和entry
之间。
在这种情况下的另一个问题是你的插入逻辑中有一些错误。
这是您的插入逻辑:
if(entry == NULL){
entry = new HashNode(key);
if(prev == NULL){
hTable[hashLoc] = entry;
}
else{
prev->next = entry;
}
}
else{
entry->value = key;
}
主要问题是if(entry==NULL)
if语句的else分支的逻辑无效。
在这种情况下,您需要创建一个新条目,修复prev指针并修复下一个指针。
将其重写为以下内容实际上更简单:
new_entry = new HashNode(key);
new_entry->value = value_to_insert;
if(prev == NULL){
hTable[hashLoc] = new_entry;
}
else{
prev->next = new_entry;
}
new_entry->next = entry;