我有一个模拟链表结构的任务,但使用的是节点数组而不是实际的链表。当我调用我的append函数时,我想检查我的现有数组是否已满,如果是,我想将数组大小加倍,并将我的Node追加到“list”(数组)的末尾。
我无法将阵列大小加倍。
为了给你上下文,这是我的一些.h文件:
...
const int NULL_INDEX = -1;
struct Node {
char info;
int next;
};
class LList1 {
private:
Node free [4];
// When more memory is called for, the array will double in size
// returns true if reallocation of memory was successful
bool doubleSize();
.
.
.
}
这是我的.cpp文件中试图将数组大小加倍的部分:
bool LList1::doubleSize() {
Node* newArray = new Node[this->length()*2];
memcpy(newArray, free, this->length()*2);
free = newArray;
return true;
}
我也尝试过使用realloc和其他功能。我一直有同样的问题。 这条线
"free = newArray"
在XCode中不断给我这个错误: “数组类型'节点[4]'不可分配”
请告诉我一些更好的方法来做到这一点。所有在线解决方案似乎都适用于整数组,但不适用于我的节点阵列。
非常感谢。
答案 0 :(得分:1)
您的代码中有几件事情不正确:
free
属性是一个静态数组。在你的情况下,你需要一个动态的,具有适当的构造函数。 memcpy
命令采用字节大小,因此您需要乘以sizeof(Node)
。doubleSize()
方法是私有的。以下是编译和运行的代码的更正版本:
...
const int NULL_INDEX = -1;
struct Node {
char info;
int next;
};
class LList1 {
public:
LList1();
~LList1();
int getLength();
bool doubleSize();
private:
int length;
Node* free;
// When more memory is called for, the array will double in size
// returns true if reallocation of memory was successful
};
int LList1::getLength() {
return this->length;
}
LList1::LList1() {
this->free = new Node[4]; // Default size
this->length = 4;
}
LList1::~LList1() {
delete []this->free;
}
bool LList1::doubleSize() {
Node* newArray = new Node[this->length*2];
memcpy(newArray, free, this->length * sizeof(Node));
free = newArray;
this->length *= 2;
return true;
}
int main(int, char **) {
LList1 l;
std::cout << "Original length: " << l.getLength() << std::endl;
l.doubleSize();
std::cout << "After doubling length: " << l.getLength() << std::endl;
return 0;
}
答案 1 :(得分:0)
你在arrays and pointers之间感到困惑。您的变量free是一个常量指针,无法重新分配。如果要修改其值,则需要将Node free [4]
更改为Node *free
。
C/C++ int[] vs int* (pointers vs. array notation). What is the difference?