如何改进单向链表插入函数 - C++
How to improve a singly linked list insert function - C++
我正在使用带有递归插入函数的单向链表制作字典,该函数目前可以完成它的工作。我有两个来自社区的请求:
- 我
想知道是否有人可以查看我的代码并告诉我是否有任何内存泄漏,如果是,我应该如何删除它们。
通过查看其他列表,我看到它们都使用尾节点。为什么有必要这样做?
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;
}
}
- 我在这里发布的代码中没有看到任何内存泄漏。其他地方可能有一些(通常在析构函数或复制构造函数/赋值运算符中(。我不明白你为什么要将字典实现为链表。这似乎效率很低。
- 指向列表中最后一个节点的指针不是必需的。在这种情况下,它不会给你任何东西,因为你无论如何都要迭代整个列表(以找到匹配的键(。如果您不这样做,但仍然希望有效地插入列表末尾,那么尾部指针是有意义的。
但是,您的代码可以简化很多:
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);
}
}
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗