[英]Linked List implementation in C++
我有三个标头(.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 无法从迭代器中读取值。 甚至迭代器类本身在返回迭代器对象的方法上也显示为波浪形。 有人可以帮助我了解这里出了什么问题。
如果您的编译器没有告诉您问题出在哪里,请从简单开始并逐步构建。 你能想到的最简单的iterator
是什么? 尝试这个:
template <typename T>
class iterator{
};
到现在为止还挺好。 现在一次增加一点复杂性,在每一步进行测试。 您现在可以编写slist
,或向iterator
添加功能。 一旦你写了类似的东西,你就会注意到一个问题
for(iterator i= begin(); i!= last; ++i; ++s);
当您遇到这样的障碍时,在修复它之前不要增加任何复杂性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.