【问题标题】:Linked List pop() function链表 pop() 函数
【发布时间】:2011-02-11 17:58:12
【问题描述】:

考虑以下列表:

[LinkNode * head -- LinkNode * node1 -- LinkNode * node2]

我正在创建一个 FIFO 堆栈。 我调用我想弹出 node1 的 pop()。

LinkNode::LinkNode(int numIn) {
    this->numIn = numIn;
    next = null;
}
.
.
.
int LinkNode::pop() {
    Link * temp = head->next;
    head = temp->next;
    int popped = head->nodeNum;
    delete temp;
    Return numOut;

问题:
1) head 应该是指针或 LinkNode *?
2) Link * temp 是在调用堆栈上创建的,当 pop 完成时不会自动删除 temp 吗?
3) 我的主要困惑是 temp->next 的值是多少?这是否指向 node1.next 等于 node2?

感谢您的帮助?

我的参考资料是 Weiss 的 C++ for Java Programmers。

【问题讨论】:

  • 如果您可以发布单独的问题而不是将您的问题合并为一个问题,则最好。这样一来,它可以帮助回答您的问题的人以及其他寻找您的至少一个问题的人。

标签: c++ list linked-list


【解决方案1】:
  1. LinkNode * 是一个指针。所以我不确定你在问什么。
  2. 变量超出范围,但这不会自动删除动态分配的数据。在 C++ 中,如果您动态分配数据(调用 new),则需要释放它(调用 delete

【讨论】:

  • 换句话说,head 被初始化为:LinkNode * head 这将使它成为另一个节点。因此,head->next 将等于 node1,但我想获取 node1-next 的值,即 node2。我很难将语法应用于这个概念。谢谢。
  • @JKid314159 - 您需要区分指针和节点。通常,head 会指向第一个节点(所以head->nodeNum 来自第一个节点),而head->next 会指向第二个节点(所以head->next->nodeNum 来自第二个节点)。
【解决方案2】:

在实现链表、树或其他链接数据结构时,将实现分离为封装对象(LinkedList、Tree 等)和节点对象(LinkedListNode、TreeNode 等)通常很有用,它允许一种是在有问题的实际节点之外实现方法。从节点弹出的一个问题是弹出的节点变得无效。将节点封装在一些更大的数据结构中允许该数据结构在外部执行弹出,删除旧节点。

要考虑的另一件事是,如果没有要弹出的项目,弹出的行为将如何。它应该抛出异常吗?它应该只是导致未定义的行为吗?

在一个典型的链表中,封装类通常维护一个指向第一个元素的指针、一个整数个元素的计数,以及一个可选的指向最后一个元素的指针(用于恒定时间插入到链表的末尾) .要实现堆栈,您只需要一个指向列表前面的指针。

局部变量会自动销毁;但是,您的指针是局部变量,而不是它指向的项目。如果没有显式删除,您的指针指向的项目不会被释放。

在您的弹出代码中,您实际上删除了太多项目。应该是:

int 结果 = head->nodeNum; // 提取结果 链接节点* tmp = 头; // 保存它以便我们可以删除它 头=头->下一个; // 将头部向前移动到下一个项目 删除 tmp; // 释放前一个头 返回结果;

另外,在尝试弹出之前不要忘记检查 head 是否为非空。

【讨论】:

  • 我被卡在了 head = head->next 这不等于 node1,因为 head 是 LinkNode * head,具有 int 值和字段 LinkNode * next。所以,head->next 指向 node1。请在这里稍微混淆一下。
  • @JKid,每个节点的下一个指针应该指向列表中的下一个节点。头指针指向列表中的第一个节点。因此,head->next 指向列表的第二个元素。因此,head = head->next 获取当前的第二个元素并使其成为第一个元素。其他代码确保旧的第一个元素(现在不再在列表中)被正确释放,并返回旧的第一个元素的内容。
  • 将 head 移动到下一个节点 node2 后,tmp 现在指向 node1。换句话说,指针 temp 指向 node1 的内存地址。调用“delete tmp”删除了 tmp。在此调用之前,是否可以调用“delete *tmp”来删除 tmp 指向的对象?调用“delete tmp”会删除对 node1 的引用,但不会删除 node1? Node1指向node2?混在这里???
  • @JKid314159,表达式“delete p”调用p指向的对象的析构函数并释放p指向的内存。它不会释放指针 p 本身(请记住,p 只是一个地址,用于保存该地址的存储空间,即 p,可能位于堆栈上,在这种情况下,这是没有意义的)。
  • "delete tmp" 删除 &tmp 处的对象,并清除 "tmp" 表示的内存地址。 tmp 是指针 tmp 指向的内存地址。然后 tmp 在调用堆栈展开时被销毁。凉爽的!很酷!
猜你喜欢
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2014-07-01
  • 1970-01-01
  • 2015-06-11
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多