-2

我遇到了这个问题,我需要实现一个链表,但是存储在节点中的元素的数据类型可能是字符串或指向另一个类的指针,

class Node{
    public:
        string data;
        void *link;
        Node *next;

        Node(){
            link = next = NULL;
        }
        Node(string str){
            data = str;
        }
        Node(void *ptr){
            link = ptr;
        }
};

class List{
    Node *head;
    Node *tail;

    public:
        void insert(string str){
            Node *newNode = new Node(str);
            /* ... */
        }
        void insert(void *ptr){
            Node *newNode = new Node(ptr);
            /* ... */
        }
};

我尝试使用模板,但我不能,我怎么能使用模板呢?

4

2 回答 2

1

STL 有一个std::list模板类,你真的应该使用它。但是,如果您想实现自己的类,请尝试以下操作:

template<typename T>
class Node
{ 
public: 
    Node *next; 
    T data; 

    Node(const T &value)
        : next(NULL), data(value)
    {
    } 
}; 

template<typename T>
class List
{ 
private:
    Node<T> *head; 
    Node<T> *tail; 

public: 
    List()
        : head(NULL), tail(NULL)
    {
    }

    void insert(const T &value)
    { 
        Node<T> *newNode = new Node<T>(value); 
        if (!head)
            head = newNode;
        if (tail)
            tail->next = newNode;
        tail = newNode;
    } 
}; 
于 2012-09-08T01:52:49.500 回答
1

你可能会做这样的事情:

template <class T>
class List 
{
public:
    List(): root(NULL) {};
    ~List();
    bool add(const T& item);
    ....

private:
    typedef struct Node {
        T item;
        struct Node *next;
    } Node; 
    Node *root;
};

看到其他答案会很有趣。C++ 不是我最擅长的话题,但是这个例子应该可以编译并且可以工作。您知道在 C++ 中,struct 是一种“默认公共”类,因此您甚至可以在其中包含函数(不过,我宁愿将私有函数添加到您的列表中)。

于 2012-09-07T22:41:32.563 回答