【问题标题】:What If I Put All Nodes of LinkedList into an Array?如果将 LinkedList 的所有节点都放入一个数组中会怎样?
【发布时间】: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


【解决方案1】:

如果我把 LinkedList 的所有节点都放到一个数组中呢?

那么这就是节点所在的位置。

但是,deallocate 程序并没有完全运行并没有错误地退出

这有什么问题吗

是的,有问题。

问题是你只能传递一个指向delete的指针,如果你从new得到指针(并且它最多只能删除一次,如果你创建了一个数组,那么你必须使用delete[] )。

当您执行delete n; 时,您会发现您从未将任何n-&gt;next(将是递归调用中的n)分配给从new 返回的指针值。因此,程序的行为是不确定的。


如果你像这样分配对象:

Node* n = new Node [k];

那么你必须像这样解除分配:

delete[] n;

【讨论】:

  • 太棒了!谢谢,这行得通!看来我没有完全理解“删除”
猜你喜欢
  • 1970-01-01
  • 2016-03-04
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-13
  • 1970-01-01
相关资源
最近更新 更多