实现双向链表,其中数据存储在堆上?

Moh*_*zen 2 c++ malloc

我试图实现一个双向链表,其中节点存储在堆栈上,但堆上的节点数据.您可以使用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);    
}
Run Code Online (Sandbox Code Playgroud)

我总是得到以下错误:

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.
Run Code Online (Sandbox Code Playgroud)

为什么我会收到以下错误?怎么解决?我做错了什么?

Mar*_* A. 5

建议:不要在C++中使用malloc,使用newdelete处理堆.更强大的忠告:请勿混合 new/delete使用malloc/free.错误来自C++需要演员的事实void*

first->d = (struct Data*)malloc(sizeof(struct Data *));
                                                   ^ this is also wrong (read more later)
Run Code Online (Sandbox Code Playgroud)

其他建议:了解智能指针和可能的容器.它们会让您在专注于算法的同时为您节省很多麻烦.

从算法来讲,你的(我想是不完整的)代码可能不会做你想要的:你为指针分配空间(Node对象已有的东西),所以你最终会得到一个指向另一个指针的空间的指针(? ).这可能就是你的意思

first->d = new Data(d);
Run Code Online (Sandbox Code Playgroud)

我要把剩下的作为锻炼来解决.

  • 他们还需要调用构造函数,因为`malloc`不会调用构造函数. (2认同)