我有一个在哈希表中搜索值的函数:
bool search(int n, Node* hashtable[]) {
int x = n % 10;
Node * temp;
for (temp = hashtable[x]; temp != NULL; temp = temp->next) {
if (temp->value == n) {
return true;
}
}
return false;
}
如何创建一个删除hashtable
中的值的函数?
我猜我必须将return true;
部分更改为:
“好吧,删除那个值,但那个链表中的其他值怎么样?”
例如,我有112 -> 1112 -> 111112
,我想删除1112
。
答案 0 :(得分:2)
要删除单链表中的内容,您必须获取指向它的链接以指向下一个元素或NULL
(如果删除最后一个元素)。删除仅包含一个条目的列表时,您需要将hashtable[n]
更改为NULL
。但是,我们无法判断这个列表是单链还是双链。如果Node也有prev
指针,您还需要以类似的方式更正它。我的建议是写出你需要在纸上处理的案例,并思考指针应该被移动的方式。
案例1
hashtable[n] -> Node-to-delete -> NULL
案例2
hashtable[n] -> Node -> Node-to-delete -> NULL
案例3
hashtable[n] -> Node-to-delete -> Node -> NULL
案例4
hashtable[n] -> Node -> Node-to-delete -> Node -> NULL
我猜我必须改变返回true;部分内容如下:“好的,删除该值,但该链表中的其他值呢?”
如果调用代码要求删除列表中的值,则可能要也可能不想验证是否找到了该元素。如果您想给调用者提供洞察力,那么您仍然可以返回true或false。最好使用枚举来明确导入返回值:
enum Result { Element_Found_And_Deleted, Element_Not_Found };
Result delete(int n, Node* hashtable[]);
// client usage:
if (delete(4, my_hashtable) != Element_Found_And_Deleted)
FATAL("element not found - code must be broken");
...if applicable, or perhaps...
if (delete(4, my_hashtable) != Element_Found_And_Deleted)
std::cout << "hey, you haven't added that value yet\n";
对于search
,如果节点包含的内容超过value
,则调用者可能想要访问它,并且返回指向数据的指针比布尔指示符更有用是否找到了节点。