![]() |
#2
shining1002008-02-09 15:40
链表的头文件
//保存的文件名为List.h #ifndef LIST_H #define LIST_H #include "ListIterator.h" using namespace Shining100ListIteraor;//引用迭代器类的名字空间 namespace Shinining100List { template<class T> class List//链表类 { public: typedef ListIterator<T> ListIterator;//在链表类中对迭代器类进行重命名 List():node(NULL),head(NULL){}//默认构造函数,将链表的头结点和当前结点设为NULL List(const List<T>& l);//复制构造函数,将另外一个链表的所有结点赋给当前链表 void headInsert(const T& dataValue);//将值为dataValue的结点插入链表的头部 void insert(const T& dataValue);//将值为dataValue的结点插入到noed结点的后面 void deleteNode();//删除node结点的下一个结点 void deleteFirstNode();//删除头结点 Node<T> search(const T& target);//搜索链表中是否存在值为target的结点 bool isEmpty() const;//判断链表是否为空 ListIterator begin() const{return ListIterator(head);}//使迭代器指向链表的头 ListIterator end() const{return ListIterator();}//使迭代器指向链表的结尾 List<T>& operator =(const List<T>& rightSide);//重载操作符=,将另外一个链表的所有结点赋给当前链表 virtual ~List(); private: Node<T>* node;//链表的当前结点 Node<T>* head;//链表的头结点 }; } #endif [[it] 本帖最后由 shining100 于 2008-2-11 16:56 编辑 [/it]] |
包括了单链表,堆栈,队列,以及二叉数和迭代器
首先发迭代器
//保存的文件名为ListIterator.h
#ifndef LISTITERATOR_H
#define LISTITERATOR_H
namespace Shining100ListIteraor//定义迭代器的名字空间
{
template<class T>
class Node//定义链式结构的结点类
{
public:
Node(const T& dataValue,Node<T>* linkValue):data(dataValue),link(linkValue){}//结点类的构造函数,并对结点赋于一个类型为T的值,和指向下一个结点的指针
const T getData() const{return data;}//返回结点的数据
Node<T>* getLink() const{return link;}//返回该结点指向下一个结点的指针
void setData(const T& dataValue){data=dataValue;}//给结点赋于一个类型为T的值
void setLink(Node<T>* linkValue){link=linkValue;}//设置该结点指向下一结点的指针
private:
T data;//结点的值
Node<T>* link;//该结点指向下一个结点的指针
};
template<class T>
class ListIterator//链式结构的迭代器类
{
public:
ListIterator():current(NULL){}//将当前结点的值指向空
ListIterator(Node<T>* currentValue):current(currentValue){}//将当前结点的值指向值currntValue
const T operator *(){return current->getData();}//重载操作符*,读取当前结点的值
ListIterator operator ++()重载操作符++,使指针指向下一个结点
{
current=current->getLink();//使指针向下移
return *this;
}
ListIterator operator ++(int)重载操作符++(操作符在数的后面)
{
ListIterator startVersion(current);
current=current->getLink();//使指针向下移
return startVersion;
}
bool operator ==(const ListIterator& rightSide) const{return current==rightSide.current;}//重在操作符==,判断等号左右两边的值是否相等
bool operator !=(const ListIterator& rightSide) const{return current!=rightSide.current;}//重在操作符!=,判断等号左右两边的值是否不相等
private:
Node<T>* current;//指向当前结点的指针
};
}
#endif
[[it] 本帖最后由 shining100 于 2008-2-10 12:04 编辑 [/it]]