数组样式的链表实现C ++

时间:2016-09-26 06:58:13

标签: c++ dynamic nodes

我有一个模拟链表结构的任务,但使用的是节点数组而不是实际的链表。当我调用我的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]'不可分配”

请告诉我一些更好的方法来做到这一点。所有在线解决方案似乎都适用于整数组,但不适用于我的节点阵列。

非常感谢。

2 个答案:

答案 0 :(得分:1)

您的代码中有几件事情不正确:

  1. 您的free属性是一个静态数组。在你的情况下,你需要一个动态的,具有适当的构造函数。
  2. memcpy命令采用字节大小,因此您需要乘以sizeof(Node)
  3. 也许是有意的,但doubleSize()方法是私有的。
  4. 以下是编译和运行的代码的更正版本:

    ...
    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?