我正在使用带有递归插入功能的单链表制作一本字典,目前正在完成它的工作。 我有两个来自社区的请求:
我想知道是否有人可以查看我的代码并告诉我是否有任何内存泄漏,如果有,我应该如何删除它们。
通过查看其他列表,我发现它们都使用尾节点。为什么这有必要?
void dictionary::insert(Key k, Item i)
{
if (head == nullptr)
{
head = new Node(k, i);
}
else insertRec(k, i, head);
}
void dictionary::insertRec(Key k, Item i, Node* current)
{
Node* temp;
if (current->key == k)
{
current->item = i;
}
else if(current->nextNode != nullptr)
{
insertRec(k, i, current->nextNode);
}
else if (current->nextNode == nullptr) {
temp = new Node(k, i);
current->nextNode = temp;
}
}
答案 0 :(得分:2)
但是,您的代码可以简化很多:
void dictionary::insert(Key k, Item i)
{
for (Node **pp = &head; *pp; pp = &(*pp)->nextNode) {
if ((*pp)->key == k) {
(*pp)->item = i;
return;
}
}
*pp = new Node(k, i);
}
这是一个简单的循环,不需要递归,并且您不需要对空指针进行两次单独的测试。
或者,如果必须使用递归:
void dictionary::insert(Key k, Item i)
{
insertRec(head, k, i);
}
void dictionary::insertRec(Node *¤t, k, i)
{
if (!current) {
current = new Node(k, i);
} else if (current->key == k) {
current->item = i;
} else {
insertRec(current->nextNode, k, i);
}
}