2013-11-15 59 views
0

我想在C++中實現一個鏈接ArrayList作爲教學目的,雖然我碰到了一個障礙,但我不確定如何解開它。我的指針數組似乎不是由指針組成的,而是由實際對象組成的。鏈接ArrayList實現

保持我的代碼儘可能簡短。

//arraylist.h//

class classArrayList { 
private: 
    class Node { 
      Node(); 
      //accessors 

    }; 
    Node* classArray; 

public: 
    classArrayList(); 
}; 

//arraylist.cpp//

classArrayList::classArrayList() { 
    Node* node = new Node(); 
    this->setHead(node); 
    this->setMaxSize(5); 
    classArray = new Node[5]; 
    this->classArray[0] = *node; 
    this->setSize(1); 
} 

void classArrayList::deleteNode(int index) { 
    Node* my_current = &this->classArray[index]; 
//blahblah 
} 

但是,當我去刪除一個節點, 「my_current」 不會鏈接到任何將在此列表中的下一個或前一個。試圖在零位刪除,沒有下一個。

所以肯定有一個數據節點,但它沒有鏈接,但檢查調試器我的鏈表是好的,可以工作,所以無論數組指向什麼都搞砸了。

因此,不是指向列表,而是指向唯一實例,我該如何解決這個問題?

我的代碼添加新的數組是:this-> classArray [some_index] = * new_node;爲了澄清,我想能夠有一個數組順序地指向我的鏈表中的每個對象的數組。然後,當我在我的數組列表中的任何n處請求一個時,將它引用到一個指針,然後通過它在數組中的位置對列表中的對象執行減號操作,而不是通過列表增加,直到找到我想要的第n個。

回答

1

讓你classArray雙指針,並創建一個Node指針數組。 Node* classArray;將列表頭部的地址複製到每個陣列。

classArray = new Node*[5]; 

在您的代碼通過你的發言this->classArray[0] = *node;你是不是存儲新創建的,而不是新創建的節點的內容的地址。並刪除你不刪除動態創建的列表頭。

對於複製新創建的列表的地址,你應該使用

this->classArray[0] = node; 
+0

你的意思是複製一個新創建的節點的地址?我得到一個語法錯誤:「錯誤沒有操作符匹配這些操作數。」我也很困惑你的意思是複製「頭」到每個陣列。我只有1個頭和一個n大小的列表(和尾巴,但那不相關)。我只想要一個數組,其中每個元素都是指向LinkedList中各個元素的點。 (這樣我可以在O(1)時間從數組訪問每個節點,並且如果我想順序地遍歷它,則在O(n)處通過列表本身。 – RaenirSalazar

0

該代碼正常工作。從鏈接列表中刪除節點時,將刪除指針下的數據。當您將my_current設置爲已刪除節點的地址時,您實際上不會指向任何內容。問題不在於代碼,而在於你對該主題的理解。

爲了真正建立一個工作鏈表,每個節點都應該包含一個指向下一個節點的指針。這樣,當您刪除一個節點時,您將首先能夠從指針中檢索下一個節點,並將您的my_current設置爲有效地址。

爲了解決您的問題,您應該實際閱讀有關subject的一些信息。

如果要訪問「數組樣式」中的元素,overloadoperator []

Node& classArrayList::operator [](unsigned int index) 
{ 
    Node *node = head; 
    for(unsigned int i=0;i<index;i++) 
     if(node->next()) node = node->next(); 
     else break; 
    return *node; 
} 
+0

我的鏈表的工作,因爲它應該是在陣列一部分沒有。當我使指針等於數組索引應該指向的位置時,我只是得到一個獨特的實例,即使在鏈接列表版本中,實際上也沒有下一個實例。 – RaenirSalazar

+0

那麼你**不應**在**鏈接列表**內有一個**數組**。這就是爲什麼你應該閱讀這個主題。我在答覆中給了你一個鏈接。如果你想用'[]'來訪問鏈表的元素,你應該重載'operator []'並在其中做'for'循環,在其中你可以執行'node = node-> next'直到您到達具有給定索引的元素。 –

+0

這沒有任何意義,維基百科的文章沒有進一步澄清你的意思。有意義的是,有一個數組,並且方法的每個元素都應該指向LinkedList中的相應元素。這是我對數據結構的理解。 – RaenirSalazar