实现双链接列表,其中数据存储在堆上



im试图实现一个双重链接列表,其中节点存储在堆栈中,但堆上节点的数据。您可以使用push((将带有数据的新节点添加到列表中,并使用pop((删除最后一个元素。

我在push((方法上有问题。

#include <iostream>
using namespace std;
struct Data {
    string name;
    int age;
};
struct Node {
    struct Node *next;
    struct Node *previous;   
    struct Data *d;         
};
struct Node *first;
struct Node *last;
void init() {
    first = last = NULL;
}

void push(Data d) { 
    Node *temp;
    if(first == NULL){
        first = new Node();
        first->d = malloc(sizeof(struct Data *));
        first->next = NULL;
        first->previous = NULL;
        last = first;
    } else if(last->next == NULL) {
        last->next = new Node();
        temp = last;
        last = last->next;
        last->previous = temp;
        last->d = first->d = malloc(sizeof(struct Data *));
    }
}

int main(int argc, char *argv[]) {
    init();
    Data d;
    d.name = "Name1";
    d.age = 19;
    push(d);
    d.name = "Name2";
    d.age = 24;
    push(d);
    d.name = "Name3";
    d.age = 25;
    push(d);
    d.name = "Name4";
    d.age = 18;
    push(d);
    d.name = "Name6";
    d.age = 20;
    push(d);    
}

我总是会收到以下错误:

Untitled.cpp:29:12: error: assigning to 'struct Data *' from incompatible type 'void *'
                first->d = malloc(sizeof(struct Data *));
                         ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Untitled.cpp:38:22: error: assigning to 'struct Data *' from incompatible type 'void *'
                last->d = first->d = malloc(sizeof(struct Data *));
                                   ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2 errors generated.

为什么我会收到以下错误?如何修复它?我在做什么错?

建议:请勿使用malloc,使用newdelete来处理C 中的堆。更强有力的建议:切勿将new/deletemalloc/free混合。错误来自C 需要void*

的演员
first->d = (struct Data*)malloc(sizeof(struct Data *));
                                                   ^ this is also wrong (read more later)

其他建议:了解智能指针和可能的容器。他们会为您节省很多头痛,同时让您专注于算法。

算法从算法上讲您的(我想不完整的(代码可能不会做您想要的:您正在为指针分配空间(Node对象已经拥有的东西(,因此您最终会以指向空间的指针指向空间另一个指针(?(。这可能是您首先的意思

first->d = new Data(d);

我要把其余的作为练习。

您需要将malloc()的结果投射到所需的类型。

提示 - 您的malloc的大小也有问题

相关内容

  • 没有找到相关文章

最新更新