【发布时间】:2020-05-25 09:31:44
【问题描述】:
我正在尝试实现我自己的通用数据结构版本来改进我的编码。我有一个任务需要一个可以保存int 和空指针void * data 的双向链表。我的结构有两种成员类型,一种用于int,一种用于void*。
struct Node {
int data;
void* pntData;
Node* next;
Node* previous;
};
class LL {
private:
Node* head;
Node* tail;
int size;
public:
LL();
void insert_front(int data);
void insert_front(void* data);//overloaded for void pointer data types
void printLL();//removed unrelated methods
};
这是我的 Node 结构和双向链表类。我已经能够编写处理int 的所有方法。我的困惑在于将 void 指针作为参数并将其添加到具有 int 值的同一个链表中。
我知道 void 指针是一个可以指向任何类型数据的指针,但我很困惑我应该如何将 void 指针作为参数并将其添加到我初始化的同一个链表中使用此构造函数:
LL::LL() {
head = nullptr;
tail = nullptr;
size = 0;
}
这是我的附加函数,我有重载的想法,这样如果参数是指针,数据将作为void* pntData 添加到我的类变量中。如果参数是 int,则数据将作为 int 添加到我的类变量中。
void LL::insert_front(int data) {
Node* temp = new Node();
if (head == nullptr) {
head = temp;
temp->previous = nullptr;
temp->next = nullptr;
temp->data = data;
tail = temp;
}
else {
temp->previous = nullptr;
temp->next = head;
temp->data = data;
head->previous = temp;
head = temp;
}
size++;
}
void LL::insert_front(void* data) {
Node* temp = new Node();
if (head == nullptr) {
head = temp;
temp->previous = nullptr;
temp->next = nullptr;
temp->pntData = data;
tail = temp;
}
else {
temp->previous = nullptr;
temp->next = head;
temp->pntData = data;
head->previous = temp;
head = temp;
}
size++;
}
问题可能在于我的printLL() 函数,它可能需要一个 if/else 来确定是需要打印 int 还是需要打印 void* pntData。
请指点我正确的方向。
【问题讨论】:
-
对你来说“正确的方向”是一本涵盖现代 C++ 的 C++ 书籍;特别是关于如何使用
std::variant模板的章节,它完全可以满足您的要求。它会让你的程序更简单,就像只需要一个insert_front(),而不是痛苦的代码重复。读完,再多练习,你应该可以完成这个“在线作业”。祝你好运! -
我认为将链接列表模板化为值类型可能更具教育意义,即编写一个包含
Node<T>类的通用LinkedList<T>。然后,您可以使用保存整数的链表和(单独的)void 指针。 -
这似乎不是一个好的练习。如果您不存储有关指针指向的类型的信息,那么在容器中存储
void*指针是没有意义的,但这是一项相当困难的任务,实际上您只需使用std::variant或(很少)std::any改为类型通用容器的元素类型。 -
如果元素是
void*,您希望printLL()打印什么?存储在指针中的地址还是指针指向的东西?您是否希望列表接受一个空指针作为有效值来存储void*? -
虽然我同意你的看法,但这是我必须完成的任务。所以我不能将 void 指针存储在 Node 结构中而不同时存储类型?
标签: c++ linked-list void-pointers