c++ - 如果将 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 程序并没有完全运行并且没有错误地退出
这种创建链接列表的方式有什么问题吗?或者只是释放问题?
解决方案
如果将 LinkedList 的所有节点都放入一个数组中会怎样?
然后就是节点所在的位置。
但是,deallocate 程序并没有完全运行并且没有错误地退出
这有什么问题吗
是的,有问题。
delete
问题是,如果您从中获取指针,您只能传递一个指针new
(并且它最多必须被删除一次,如果您创建了一个数组,那么您必须使用delete[]
)。
当你这样做时delete n;
,你会发现你从来没有分配任何一个n->next
(这将是n
递归调用中的)来拥有一个从new
. 因此,程序的行为是未定义的。
如果你像这样分配对象:
Node* n = new Node [k];
那么你必须像这样解除分配:
delete[] n;
推荐阅读
- python - boto3 未知服务“mturk”
- css - 如何使用 Bulma 创建一系列按钮在 css 中右对齐的行?
- c - 多个 MPI 进程的相同数组指针
- python - 转换 Unicode 值
- php - PHP 连接到 MS SQL。适用于工作站但不适用于 2 台服务器
- pointers - C2HS 指针类型对应关系
- xcode - codesign requires keychain password even after 'security unlock-keychain'
- r - R通过分组变量在第一次出现值时使用条件语句创建新变量
- python - pyspark count 给定列的每一行中的下划线数
- python-3.x - Unable to read column types from amazon redshift using psycopg2