我的指示是...
// 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;
}
但是我不确定这是否正确,是否...
感谢您的任何建议或帮助。
您的函数正在声明一个本地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;
}