【问题标题】:How to improve a singly linked list insert function - C++如何改进单链表插入功能 - C++
【发布时间】:2018-01-06 12:41:53
【问题描述】:

我正在使用带有递归插入函数的单链表制作字典,该函数目前可以完成它的工作。 我有两个来自社区的请求:

  1. 我想知道是否有人可以查看我的代码并告诉我是否有任何内存泄漏,如果有,我应该如何删除它们。

  2. 通过查看其他列表,我发现它们都使用尾节点。为什么需要这样做?

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;
    }
}

【问题讨论】:

  • 可能这更适合codereview.stackexchange.com
  • 1:也许,也许不是。 2:如果您需要快速访问尾部,它会有所帮助。这确实更适合codereview.stackexchange.com,但请记住也要发布Node 结构,包括您使用的构造函数。最好是Minimal, Complete, and Verifiable Example
  • 通常是list 不比较它的内容,所以有一个尾巴并在那个位置插入是相当合理的方法。
  • 啊,我不知道这存在。谢谢你。在此示例中,您将如何添加尾节点?
  • 好吧,list 通常是没有概念的key,既然你有,有尾巴也没多大用处。

标签: c++ dictionary singly-linked-list


【解决方案1】:
  1. 我在您在此处发布的代码中看不到任何内存泄漏。其他地方可能有一些(通常在您的析构函数或复制构造函数/赋值运算符中)。而且我不明白您为什么要将字典实现为链表。这似乎相当低效。
  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 *&current, k, i)
{
    if (!current) {
        current = new Node(k, i);
    } else if (current->key == k) {
        current->item = i;
    } else {
        insertRec(current->nextNode, k, i);
    }
}

【讨论】:

  • 尾部是指向列表中最后一个节点的指针。我使用单链表的原因是因为它是大学作业。我们之前做过一个二叉搜索树,我认为这个任务的目的是讨论效率。我们还被告知要使用显式递归,我和谷歌都知道这是什么意思。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
  • 2022-01-07
相关资源
最近更新 更多