所以最近我一直在学习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;
}
在这种情况下,节点被链接并也放入数组中;
但是,解除分配的程序无法完全运行,并且没有错误地退出
这种创建链接列表的样式是否有问题,或者仅仅是释放问题?
如果将LinkedList的所有节点放入数组怎么办?
然后就是节点所在的位置。
但是,解除分配的程序无法完全运行,并且没有错误地退出
这个有问题吗?>
是,有问题。
问题是,如果从delete
获得了指针,则只能将指针传递给new
(并且该指针最多必须删除一次,并且如果创建了数组,则必须使用delete[]
) 。
[当您执行delete n;
时,您会发现您从未分配n->next
中的任何一个(在递归调用中将为n
)具有从new
返回的指针值。结果,该程序的行为是不确定的。
如果分配这样的对象:
Node* n = new Node [k];
然后您必须像这样取消分配:
delete[] n;