【问题标题】:Create Dynamically Allocated Array with Pointers to Structs C++使用指向结构 C++ 的指针创建动态分配的数组
【发布时间】:2016-02-22 06:09:52
【问题描述】:

所以我目前有一个简单的结构(链表),我将在 HashMap 中使用它:

struct Node {
    std::string key, value;
    Node* head;
}

我目前正在尝试使用指向每个结构的指针动态分配一个数组。这就是我现在所拥有的......

Node* nodes = new Node[100]

我知道这会将一个包含 100 个节点的数组分配到内存中(稍后我将不得不删除它);但是,在迭代时尝试遍历这些节点(我将其实现为链表)...

for (int x = 0; x < 100; x++) {
    Node current = nodes[x]; // Problem is I wanted an array to node pointers. This is not a pointer.
    while (current != nullptr) { // this isn't even legal since current is not a pointer.
        // DO STUFF HERE
        current = current.next; // This is not a pointer access to a method. I'm looking to access next with current->next;
    }
}

希望我已经足够清楚了。有人可以如何分配指向结构的动态指针数组吗?到目前为止,我能够动态分配一个结构数组,而不是一个指向结构的指针数组。

【问题讨论】:

  • 基本上,通过为您的节点提供连续内存,您正在破坏整个链接列表的想法。不需要下一个节点,因为您有空间信息(即索引)
  • 您似乎不确定是要链表还是动态数组。
  • 我的想法是我正在实现一个 hashmap,因此需要一个动态分配的 LinkedLists 数组。
  • @Xari 这清楚了,你应该编辑你的问题。并且请不要在 cmets 中描述问题,没有人阅读 cmets :)
  • 完成。谢谢你提醒我。我只是偶然发现了这个声明...... Node** nodes = new Node*[100],它显然创建了一个带有指向我的节点的指针的动态数组。这是正确的吗?

标签: c++ arrays pointers struct


【解决方案1】:

有两种方法。要么分配一个结构数组,然后再引入一个指针,该指针将指向数组中将扮演头部角色的元素。

例如

Node *head = nodes;

(在这种情况下,头指向节点[0])

列表不再需要后,您必须使用运算符将​​其删除

delete [] nodes;

或者您确实可以像这样分配指向结构的指针数组

Node **nodes = new Node *[100];

但在这种情况下,数组的每个元素又应该是指向动态分配对象的指针;

要删除列表,您首先必须删除数组元素指向的每个对象,例如在循环中

for ( int i = 0; i < 100; i++ ) delete nodes[i];

然后删除数组本身

delete [] nodes;

例如,在分配数组时,最好用零初始化数组的每个元素

Node **nodes = new Node *[100]();

【讨论】:

  • 如果是我将实施的第二个,在删除它时我会删除 [] 个节点还是删除[][] 个节点?
  • @Xari 您需要一个 for 循环来删除每个节点。然后delete[]删除“容器”
  • @Xari 是否需要删除数组元素指向的每个对象取决于您将如何编写释放列表的函数或析构函数。或者您需要使用 delete 手动删除数组元素指向的每个对象。然后必须使用 delete [] 删除整个数组。
  • 非常感谢你们解决问题。它让事情变得更加清晰。尤其是使用新的 Node*[100]。现在很有意义。
  • 在这一行中: Node *nodes = new Node *[100]() 这是否意味着结构内的变量将被初始化为 0?如果是这样,在这种情况下,变量“Node head”会是什么?
【解决方案2】:

我向你推荐了这个结构:

class myList {

struct Node {
string value;
Node* next;
}

/*Public methods .. Add/Set/Get/Next/isEmpty.. etc ... */
Node* head, *tail;
};

主要内容: myList* lis = new myList[number]; 那么你有很多列表!并通过方法和运算符在课堂上完成所有工作,就像如果你想要下一个节点只需调用 lis[0].getNext(); 如果你想跳过当前节点 dolis[0].Next(); ... etc ..

这个怎么工作,你尝试做的看起来像C程序!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 2020-11-18
    • 2013-04-18
    • 2011-01-02
    • 2022-01-14
    • 2012-07-16
    相关资源
    最近更新 更多