在数组引用中放置链接列表的内容

问题描述 投票:0回答:1

我的指示是...

// Description: Places the payload contents of the list in the
    //          array referenced by 'populateMeWithElements'.
    // Returns the number of elements that were placed
    //          in the provided memory location.
    // Precondition: Enough memory has been allocated to the provided
    //          memory location to hold the full contents
    //          of the list.
    // Postcondition: The memory allocated for 'populateMeWithElements'
    //          has been deallocated after the completion of
    //          this method call.
    int getListElements(int* populateMeWithElements);

我写了这封信...

int OOLList::getListElements(int* populateMeWithElements) {
    int count = 0;
    OOLNode* iterator = this->start;
    int* populateMeWithElements = new int[getListSize()];
    for (int i = 0; iterator->next != NULL; i++) {
        populateMeWithElements[i] = iterator->payload;
        iterator = iterator->next;
        count++;
    }

    return count;
}

但是我不确定这是否正确,是否...

  1. 如何显示驱动程序中的内容
  2. 我在哪里分配内存(我是在驱动程序中还是在编写的函数中执行此操作?)

感谢您的任何建议或帮助。

c++ pointers data-structures memory-management linked-list
1个回答
0
投票

您的函数正在声明一个本地populateMeWithElements变量,该变量shadows输入populateMeWithElements参数。您正在填充在本地分配的数组,完全没有填充调用方的数组。

为此,您的函数根本不应该使用new[],因为指令明确指出了该函数的先决条件是调用者已经预先分配了足够大的数组,并且将在功能退出。因此,函数的工作仅是填充调用方的数组,仅此而已。

并且在该任务上,您的循环是错误的。 iterator->next != NULL必须为iterator != NULL,否则,如果列表为空,则对iterator->next的第一次访问将失败,如果列表不为空,则将跳过尾节点的payload

尝试以下方法:

int OOLList::getListElements(int* populateMeWithElements) {
    int count = 0;
    OOLNode* iterator = this->start;
    for (int i = 0; iterator != NULL; i++) {
        populateMeWithElements[i] = iterator->payload;
        iterator = iterator->next;
        ++count;
    }
    return count;
}

可以进一步简化:

int OOLList::getListElements(int* populateMeWithElements) {
    int count = 0;
    for (OOLNode* iterator = this->start; iterator != NULL; iterator = iterator->next) {
        populateMeWithElements[count++] = iterator->payload;
    }
    return count;
}

甚至:

int OOLList::getListElements(int* populateMeWithElements) {
    int* ptr = populateMeWithElements;
    for (OOLNode* iterator = this->start; iterator != NULL; iterator = iterator->next) {
        *ptr++ = iterator->payload;
    }
    return ptr - populateMeWithElements;
}
© www.soinside.com 2019 - 2024. All rights reserved.