#include <iostream>
#include <stdexcept>
using namespace std;
template<class ElemType>
class dblist
{
public:
dblist(); //构造函数
~dblist(); //析构函数
bool insert(int pos, ElemType e); //在pos位置插入e,插入成功返回true。否则返回false
bool del(int pos, ElemType &e); //在pos位置删除元素,用e返回
bool del(int pos); //在pos位置删除元素,用e返回
bool empty() const; //判断链表是否为空
int length() const; //返回链表的长度
ElemType& operator[] (int index) throw(out_of_range);//返回index位置的值
private:
class dbnode //结点类型
{
public:
dbnode() {}
dbnode(ElemType elem, dbnode *pre, dbnode *nex) : data(elem), prev(pre), next(nex){} //构造函数
ElemType data; //结点数据
dbnode *prev; //前驱结点
dbnode *next; //后继结点
};
dbnode *head; //定义一个头结点
int len; //链表的长度
};
template<class ElemType>
dblist<ElemType>::dblist() : len(0)
{
head = new dbnode();
head -> prev = head;
head -> next = head;
}
template<class ElemType>
dblist<ElemType>::~dblist()
{
head -> prev -> next = NULL; //断开循环链表的链接。
dbnode *p;
while(head -> next)
{
p = head -> next;
head -> next = head -> next -> next;
delete p;
}
delete head;
}
template<class ElemType>
bool dblist<ElemType>::insert(int pos, ElemType e)
{
if(pos < 0 || pos > len)
return false;
dbnode *temp = head;
for(int i = 0; i < pos; ++i)
temp = temp -> next;
dbnode *new_node = new dbnode(e, temp, temp -> next);
new_node -> prev -> next = new_node;
new_node -> next -> prev = new_node;
++len;
return true;
}
template<class ElemType>
bool dblist<ElemType>::del(int pos, ElemType &e)
{
if(pos < 0 || pos >= len)
return false;
dbnode *temp = head;
for(int i = 0; i <= pos; ++i)
temp = temp -> next;
temp -> prev -> next = temp -> next;
temp -> next -> prev = temp -> prev;
e = temp -> data;
delete temp;
--len;
return true;
}
template<class ElemType>
bool dblist<ElemType>::del(int pos)
{
ElemType e;
del(pos, e);
}
template<class ElemType>
bool dblist<ElemType>::empty() const
{
return len == 0;
}
template<class ElemType>
int dblist<ElemType>::length() const
{
return len;
}
template<class ElemType>
ElemType& dblist<ElemType>::operator[] (int index) throw(out_of_range)
{
if(index < 0 || index >= len)
throw out_of_range("out of range");
dbnode *temp = head;
for(int i = 0; i <= index; ++i)
temp = temp -> next;
return temp -> data;
}
int main()
{
return 0;
}
转载于:https://my.oschina.net/u/196018/blog/383772