簡體   English   中英

如果將 LinkedList 的所有節點都放入一個數組中會怎樣?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM