【发布时间】:2020-08-20 22:05:24
【问题描述】:
所以最近一直在学习C++,现在正在学习Linkedlist。
我想知道为什么我们不用数组来创建节点,比如说:
#include <iostream>
using namespace std;
struct Node {
int data = 0; //data
Node* next = nullptr; //next node in the linked list;
};
void deallocateLinkedList(Node* n)
{
if (n == nullptr) // An empty list; nothing to delete
return;
else{
deallocateLinkedList(n->next);
delete n;
n = nullptr;
}
}
int main()
{
int k;
cout<<"enter k as number of nodes"<<endl;
cin>>k;
Node* n = new Node [k]; //creates dynamic array;
for(int i =0;i<k;i++)
{
if (i==k-1)
{
n[i].data=i;
n[i].next=nullptr;
}
else
{
n[i].data=i;
n[i].next = &n[i+1];
}
}
deallocateLinkedList(n); //pointer points to the first node;
cout<<"programmed finished"<<endl; //indicates successful running
return 0;
}
在这种情况下,节点被链接并放入一个数组中;
但是,deallocate 程序并没有完全运行并没有错误地退出
这种创建 Linked List 的方式有什么问题,还是只是释放问题?
【问题讨论】:
-
这样添加的节点数不能超过
k。如果这样做,则需要进行新的动态内存请求,将所有节点复制到该新内存块中,释放原始块,然后添加新节点。这需要时间。此外,由于每个“下一个”节点都位于下一个内存地址,因此您可以省略“下一个”地址。你知道下一个在哪里。恭喜!你刚刚创建了一个向量!它具有空间局部性的好处(防止缓存抖动),但需要在容量不足时每隔一段时间重新分配一次。 -
我觉得这个问题太宽泛了,无法回答。在我自己创建的场景中,我可以迂腐地回答它并说“是的,存在问题”,这只是为了突出数组和链表之间的差异。想象一下,有人像你一样研究数组,问“为什么不分配所有节点并将它们放在链表中?”动态内存分配实际上只是决定哪些虚拟地址可以用于什么目的。有各种各样的方案可以做到这一点,每个方案都有一份优点和鳕鱼清单。
-
好吧,正如 Wyck 所说,问题看起来很广泛,并且可能会出现在某些特定场景中。并且,在这种情况下,代码停在“删除 n;”。在 deallocate 函数中,我无法弄清楚它的原因。
-
在某些情况下,您确实需要一个固定大小的节点列表(例如,减少内存碎片),但您必须注意簿记,因为您可能不会如果你用完了就分配更多。
标签: c++ arrays memory-management linked-list nodes