0

我试图在 C++ 中实现一个 Linked 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 个.

4

2 回答 2

0

代码可以正常工作。当你从你的链表中删除一个节点时,你删除了指针下的数据。当您设置my_current为已删除节点的地址时,您实际上并没有指向任何内容。问题不在于代码,而在于您对主题的理解。

为了真正制作一个有效的链表,每个节点都应该包含一个指向下一个节点的指针。这样,当您删除一个节点时,您首先能够从指针中检索下一个节点,并将您的地址设置my_current为有效地址。

为了解决您的问题,您实际上应该阅读一些有关该主题的内容。

如果要访问“数组样式”中的元素,请重载operator [].

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;
}
于 2013-11-15T04:25:58.003 回答
0

使您classArray的双指针并创建一个Node指针数组。Node* classArray;将列表头的地址复制到每个数组。

classArray = new Node*[5];

在您的代码中,您this->classArray[0] = *node;没有存储新创建的地址,而是存储新创建节点的内容。通过删除,您不会删除动态创建的列表头。

要复制新创建列表的地址,您应该使用

 this->classArray[0] = node;
于 2013-11-15T04:44:58.187 回答