【问题标题】:Why is dynamic allocation used for Linked lists?为什么动态分配用于链表?
【发布时间】:2014-02-09 16:51:08
【问题描述】:
Struct node { char ch; node *link;};

node * temp = new node;
node *temp1;

我的问题是为什么我们使用第一种方式来声明动态结构而不是第二种方式。我尝试使用第二个,加上一个类来模仿堆栈,但是 display() 函数使它进入了一个无限循环,而使用前者纠正了它。为什么?

【问题讨论】:

  • 对于初学者,我假设您意识到 c/c++ 都区分大小写? nodeNode 不同。无论哪种方式都可以Node *temp = new NodeNode *temp1- 实际上它们都是等价的。第一个例子不仅声明了变量,还为它分配了内存。您的其余问题与您未显示的代码有关。无法对看不见的代码发表评论!
  • 第二个你的意思是Node temp 没有星号?
  • @enhzflep 它们不等价。一个实例化一个node 对象,另一个没有。
  • @juanchopanza - 正如我已经说过的“第一个示例不仅声明了变量,还为它分配了内存”。声明!= 实例化。 (或者是吗??)你只是简单地表达了我的观点,尽管我认为更简洁。

标签: c++ pointers dynamic structure


【解决方案1】:

你的问题并不完全清楚,但是这个

Node *temp1;

只创建一个不指向Node 对象的指针。事实上,它指向一个您可以认为是随机的位置。你不能取消引用这个指针,你必须先让它指向一个Node

另一方面

Node * temp = new Node;

在RHS上动态分配一个Node,返回一个指向Node的指针,该指针的值用于初始化temp。所以temp 指向一个有效的Node 对象。请记住,在某些时候,您将不得不在分配有new 的所有内容上调用delete。在现代 C++ 中,您将避免这种手动内存管理并将其委托给智能指针等类型。

注意以上假设有问题的类型称为Node,而不是node

【讨论】:

  • 我明白你的意思,但我不明白的是,即使不使用节点的动态分配,指针起初似乎也能工作。怎么样?
  • @HarjyotSingh “工作”是什么意思?你的代码什么也没做。
【解决方案2】:

可以不使用new 来构造链表,但在大多数情况下,这不是一个非常实用的解决方案。我们使用链表(和树,以及其他“链接”数据结构)的原因是有某种方法可以在结构中存储任意数量的元素,以便在中间添加/删除元素。如果不是这样,我们也可以使用数组或向量。

我们可以这样做一个短链表:

Node a, b, c;
Node *head = &a;  // Head is the pointer to the first element. 
a.link = &b;
b.link = &c;
c.link = NULL; 
// Clearly we want to set ch in each node as well, but I'm ignoring it for shortness.

但是,如果我们不知道需要多少链接,这会变得非常混乱。

所以,我们使用堆来分配元素,因为我们事先不知道它们有多少。

链表使用指向链表中“下一个”(或“上一个”)节点的指针——这样,我们可以轻松地在链表中间插入一个元素。或者从中间移除一个元素。

在包含 1000 个元素的向量中,删除第一个元素意味着将 999 个元素“向上移动”。要删除链表中的第一个元素,本质上需要一个更改:将链表的头部移动到下一个元素。

删除向量的第 500 个元素需要将 499 个元素移动到“上一步”。删除链表的第 500 个元素要求第 499 个元素的链接指向第 501 个元素。这将需要一次操作。 (当然,我们还需要找到要删除的正确元素,但除非向量中的元素以某种有助于搜索的方式排序,否则这基本上是相同的工作)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-12
    • 2016-05-22
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 2013-07-18
    • 2011-01-21
    相关资源
    最近更新 更多