C ++中的链接列表实现

时间:2015-06-14 12:15:07

标签: c++ linked-list iterator

我有三个标题(.hpp)文件,用于定义节点,单链表和迭代器。这应该共同构建我的单链表。 这是节点。

#ifndef NODE_HPP
#define NODE_HPP

#include <iostream>
#include <string>

template <typename T> struct node {


public:
    explicit node(const T& value, node* next = 0): value_(value), next_(next){}


private:
    T value_;
    node* next_;

};

#endif //NODE_HPP

这是我的贱人

#ifndef SLIST_HPP
#define SLIST_HPP

#include "node.hpp"
#include "iterator.hpp"

template <typename T> class slist{

public:
    class iterator;

    slist() :head_(0){ }

    bool empty() const{return (head_==0);}

    int size() const{
        int s=0;
        iterator last=end();
        for(iterator i= begin(); i!= last; ++i; ++s);
        return s;
    };

    iterator begin() { return iterator(head_); }
    iterator end() { return iterator(0); }

    void insert(iterator p, const T& t);

    void erase(iterator p){
        node<T>* tmp = p.node_->next_;
        p.node_->value = p.node_->next_.value;
        p.node_->next_=p.node_->next_->next_;

        delete tmp;
        return p;
    };

private:
    node<T>* head_;

};

#endif //SLIST_HPP

这是我的迭代器类

#ifndef ITERATOR_HPP
#define ITERATOR_HPP

#include "slist.hpp"
#include "node.hpp"



class iterator{

public:
    explicit iterator(node<T>* node=0) :node_(node){ }

    T& operator* (){return node_-> value_;}
    T* operator->(){return node_->value_;}

    iterator& operator++(){
        if(node_ != 0) node_ = node_->next_;
        return *this;
    }

    iterator operator++(int){
        iterator tmp = *this;
        if(node_!= 0) node_ = node_->next_;
        return tmp;
    }

    bool operator==(const iterator& iter) const { return (node_ == iter.node_); }

    bool operator!=(const iterator& iter) const { return (node_ != iter.node_); }


private:
    node<T>* node_;
};

#endif //ITERATOR_HPP

问题似乎没有得到解决。代码没有编译,因为尽管在slist中定义了迭代器,但是slist不能从迭代器读入值。甚至迭代器类本身也会在返回迭代器对象的方法上显示出波浪形。有人可以帮我理解这里出了什么问题。

1 个答案:

答案 0 :(得分:0)

如果您的编译器没有告诉您问题所在,请从简单开始构建。您能想到的最简单的iterator是什么?试试这个:

template <typename T>
class iterator{
};

到目前为止,这么好。现在一次添加一点复杂性,每一步都要进行测试。您现在可以编写slist,或者向iterator添加功能。一旦你写了像

这样的东西,你就会注意到一个问题
for(iterator i= begin(); i!= last; ++i; ++s);

当你遇到这样的障碍时,除非你修复它,否则不要再增加复杂性。