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

问题描述 投票:0回答:1

所以最近我一直在学习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;
}

在这种情况下,节点被链接并也放入数组中;

但是,解除分配的程序无法完全运行,并且没有错误地退出

这种创建链接列表的样式是否有问题,或者仅仅是释放问题?

c++ arrays memory-management linked-list nodes
1个回答
0
投票

如果将LinkedList的所有节点放入数组怎么办?

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

但是,解除分配的程序无法完全运行,并且没有错误地退出

这个有问题吗?>

是,有问题。

问题是,如果从delete获得了指针,则只能将指针传递给new(并且该指针最多必须删除一次,并且如果创建了数组,则必须使用delete[]) 。

[当您执行delete n;时,您会发现您从未分配n->next中的任何一个(在递归调用中将为n)具有从new返回的指针值。结果,该程序的行为是不确定的。


如果分配这样的对象:

Node* n = new Node [k];

然后您必须像这样取消分配:

delete[] n;
© www.soinside.com 2019 - 2024. All rights reserved.