2016-09-03 49 views
0

我有以下結構:如何管理指針數組一個struct

struct Item 
{ 
    Item* nextPtr; 
    int intKey; 
    int intValueLength; 
}; 

基於這樣一個結構,我需要保持幾個鏈表,這意味着我需要跟蹤一個頭指針的爲每一個。我想過使用一個數組(HEADS),它將爲每個列表包含一個頭指針。列表的數目是可變的並且將在運行時間進行計算,所以我動態定義陣列如下:

int t = 10; 
Item* HEADS = new Item[t]; 

首先,我需要每個頭指針初始化爲NULL,因爲鏈接的列表是空的程序時運行。我如何做這個初始化?

for (int i = 0; i <= t - 1; i++) 
    // Initialize each element of HEADS to NULL. 

,當然,我也需要用正確的指針頭的每個元素更新到鏈表(在插入時和刪除項目),並獲得每頭指針的值顯示每個列表的元素。

我見過類似這樣的人在論壇上其他職位,但我仍然困惑,這就是爲什麼我問我的具體情況。

這是一個好辦法?
我會非常感謝您的建議。

尊敬,
豪爾赫·馬爾多納多

+3

爲什麼不只是一個'std :: vector >'?你不需要重新發明輪子。 –

+0

@NicoSchertler - 優秀的一點。學習C++的一部分是學習標準庫。 –

回答

0

在C++寫的初始化常見的方式for循環將

for (int i = 0; i < t ; i++) 
    HEADS[i] = NULL; 

或者你可以寫

for (int i = 0 ; i < t ; HEADS[i++] = NULL); 

這是稍微更緊湊。

至於指針數組是否是個好主意的問題 - 如果要使用可變數量的列表,也許應該使用指向其他鏈表的鏈接列表。

我想知道你的數據結構,雖然。在它中你有一個指向列表中下一個元素的指針,一個鍵值和一個值的長度,但是你沒有看到一個值的引用 - 除非「key」真的是值,在這種情況下,你有混合的術語 - 也就是說,你將某個地方的某個地方稱爲「鑰匙」,將另一個地方稱爲「價值」,也許你需要一個指向「價值」的指針?但我不知道你正在嘗試在這裏做,所以我只是想我會注意這個問題。

好運。

0

好方法嗎?這是一個非常,非常依賴的東西。好了開始學C的學生,也許對一個真正的C++程序員有好處絕對不是,如果你真的想創建一個鏈表,你應該創建一個包含這些鏈表的每個元素的類,並動態添加元素。例如,工作原理如下:std::list。 (std::list是雙向鏈表,方式更復雜)。

下面是一個示例類的這個應該怎麼樣子(從我的頭頂,沒有編制,但應該工作):

struct LinkedList 
{ 
    Item* list; 
    int size = 0; 
    LinkedList() //constructor of this class/struct, it's the function that will be called once you create an object of LinkedList 
    { 
     list = nullptr; //don't use NULL, it's deprecated (this is for C++11, or change it back to NULL if you insist on using C++98) 
    } 
    addItem(const int& key) 
    { 
     Item item; //construct a new item 
     item.intKey = key; //fill the value in the item 
     Item* newList = new Item[size+1]; //create the new list with one more element 
     for(int i = 0; i < size; i++) //copy the old list to the new list 
     { 
      newList[i] = list[i]; //copy element by element 
     } 
     list[size] = item; //fill in the new item 
     if(size > 0) 
     { 
      list[size - 1].nextPtr = &list[size]; //assign "next pointer" for previous element 
     } 
     size = size+1; //increase the size of the list 
    } 
    ~linkedList() 
    { 
     if(list != nullptr) 
     { 
      delete[] list; 
     } 
    } 
} 

現在,這是更好的,但它仍然從最佳。但是,這是應該如何使用C++。您創建對象並處理它們。你在上面做的更像C,而不是C++。

我的代碼,你必須調用:

LinkedList myList; 
myList.addItem(55); 

有很多事情要做這裏,使這個最佳。我會提幾個:

在我的代碼中,每次添加一個項目時,都會分配一個新數組。這不好! std::vector通過分配比需要更大的尺寸來解決此問題(例如,您添加1個項目,它保留10個,但僅使用1個,並且不會告訴您這一點)。一旦你需要超過10個,比如說11個,它可能會保留20個。這優化了性能。

嘗試閱讀我的代碼並理解它。你會學到很多。問問題;我會盡力回答。我的建議是:獲得一本C++書籍,並開始閱讀。