如何实现容纳整数和空指针的双向链表?

问题描述 投票:0回答:1

我正在尝试实现自己的通用数据结构版本以改善编码。我有一个作业,需要一个双向链表,该链表可以容纳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的所有方法。我的困惑在于将空指针作为参数,并将其添加到具有int值的相同链表中。

我知道void指针是可以指向任何类型数据的指针,但是对于如何将void指针用作参数并将其添加到初始化时所用的相同链表中,我感到困惑这个构造函数:

LL::LL() {
    head = nullptr;
    tail = nullptr;
    size = 0;
}

这里是我的append函数,在这里我有重载的想法,因此,如果参数是指针,则数据将作为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++ linked-list void-pointers
1个回答
1
投票

根据您的注释,您希望printLL()打印void*指针指向的对象。

这是不可能的。 void*指针没有有关其指向的类型的信息,因此您不能取消引用该指针。

如果要执行此操作,则需要在Node中存储指向处理程序函数的附加指针,printLL()将为每个Node调用以打印其void*。然后,需要在指针类型上创建insert_*函数模板,以便可以找出要为所提供类型存储的正确函数指针,即:

struct Node {
    int data;
    void* pntData;
    Node* next;
    Node* previous;
    void(*print)(void*) = nullptr; // Initialize with null pointer to indicate that no `void*` is stored.
};

//...

template<typename T>
void LL::insert_front(T* data) {
    Node* temp = new Node();
    //...
    temp->print = [](void* ptr){
        if(ptr != nullptr)
            std::cout << *static_cast<T*>(ptr);
        else
            // What to do if we stored a null pointer for `void*`
    };
    //...
}

//...

void LL::printLL() {
    //...
    if(node->print != nullptr)
        node->print(node->pntData);
    //...
}

我感觉这不是练习打算让您执行的操作,但是正如我在评论中说的那样,这对我来说首先没有意义。

© www.soinside.com 2019 - 2024. All rights reserved.