2013-11-15 58 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