我试图实现一个双向链表,其中节点存储在堆栈中,但堆上的节点数据。 您可以使用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.
为什么会出现以下错误? 怎么解决? 我做错了什么?
答案 0 :(得分:5)
建议:不要使用malloc
,使用new
和delete
来处理C ++中的堆。更强烈的建议:永远不要与new/delete
混合 malloc/free
。错误来自C ++需要来自void*
first->d = (struct Data*)malloc(sizeof(struct Data *));
^ this is also wrong (read more later)
其他建议:了解smart pointers和可能的容器。在让您专注于算法的同时,它们可以为您节省很多麻烦。
从算法上讲,你的(我想是不完整的)代码可能不会做你想要的:你为指针分配空间(Node
对象已有的东西),所以你结束了用指针指向另一个指针的空间(?)。这可能就是你在第一时间的意思
first->d = new Data(d);
我将其余部分作为练习进行修复。
答案 1 :(得分:-3)
您需要将malloc的结果转换为所需的类型。
暗示 - 你的malloc大小也有问题