首页 > 解决方案 > 如果将 LinkedList 的所有节点都放入一个数组中会怎样?

问题描述

所以最近一直在学习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 程序并没有完全运行并且没有错误地退出

这种创建链接列表的方式有什么问题吗?或者只是释放问题?

标签: c++arraysmemory-managementlinked-listnodes

解决方案


如果将 LinkedList 的所有节点都放入一个数组中会怎样?

然后就是节点所在的位置。

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

这有什么问题吗

是的,有问题。

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

当你这样做时delete n;,你会发现你从来没有分配任何一个n->next(这将是n递归调用中的)来拥有一个从new. 因此,程序的行为是未定义的。


如果你像这样分配对象:

Node* n = new Node [k];

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

delete[] n;

推荐阅读