在链表中使用模板

时间:2012-09-07 22:01:43

标签: c++ templates

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

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);
            /* ... */
        }
};

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

2 个答案:

答案 0 :(得分: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是一种“默认的公共”类,所以你甚至可以在其中包含函数(我宁愿在你的列表中添加私有函数)。

答案 1 :(得分: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;
    } 
};