Struct node { char ch; node *link;};
node * temp = new node;
node *temp1;
我的问题是为什么我们使用第一种方式来声明动态结构而不是第二种方式。我尝试使用第二个,加上一个类来模仿堆栈,但display()函数使它成为一个无限循环,而使用前者纠正它。为什么?
答案 0 :(得分:3)
你的问题并不完全清楚,但是这个
Node *temp1;
只是创建一个不指向Node
对象的指针。事实上,它指向一个您可以随意考虑的位置。你无法取消引用这个指针,你必须首先指向Node
。
另一方面
Node * temp = new Node;
在RHS上动态分配Node
,返回指向Node
的指针,其值用于初始化temp
。因此temp
指向有效的Node
对象。请记住,在某些时候,您必须在分配了delete
的所有内容上调用new
。在现代C ++中,您将避免使用此手动内存管理并将其委派给智能指针等类型。
注意以上假设相关类型名为Node
,而不是node
。
答案 1 :(得分:1)
可以在不使用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个元素。这将需要一个操作。 (当然,我们还需要找到要删除的正确元素,但除非向量中的元素以某种方式排序以帮助搜索,这基本上是相同的努力)。