[英]What If I Put All Nodes of LinkedList into an Array?
所以最近一直在學習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 程序並沒有完全運行並且沒有錯誤地退出
這有什么問題嗎
是的,有問題。
問題是,如果您從new
獲得指針,則只能將指針傳遞給delete
(並且最多只能刪除一次,如果您創建了一個數組,則必須使用delete[]
)。
當你delete n;
,您會發現您從未將任何n->next
(將是遞歸調用中的n
)分配給具有從new
返回的指針值。 因此,程序的行為是未定義的。
如果你像這樣分配對象:
Node* n = new Node [k];
那么你必須像這樣解除分配:
delete[] n;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.