列表模板类双向链表
利用双向链表形成List类能输入输出
对列表的运算符+,-,+=,-=进行重载等一般操作
可利用链表对象和C 的一维数组构造链表对象以及拷贝构造对象
链表支持一般的数据类型
能做添加、删除节点等操作
支持输入输出插入运算>>和<<
初学者求助,谢了
问题点数:50、回复次数:3Top
1 楼zzw820626(偶要分,偶要星星)回复于 2006-03-03 11:07:53 得分 0
作业贴Top
2 楼piaochen_2002(执子之手,与子偕老!)回复于 2006-03-03 11:38:34 得分 50
#include<iostream>
using namespace std;
template<class I>
struct _List_Node
{
typedef I value_type;
_List_Node *_Prev;
_List_Node *_Next;
value_type _data;
};
template<class T,class Ref,class Ptr>
struct itreator_node
{
public:
typedef T value_type ;
typedef itreator_node<T,T&,T*> iterator;
typedef itreator_node<T,Ref,Ptr> self;
typedef Ptr pointer ;
typedef Ref reference;
typedef _List_Node<T>* link_type;
link_type Node;
self &operator++()
{
Node=Node->_Next;
return *this;
}
self &operator++(int )
{
self temp=(*this);
++(*this);
return temp;
}
self &operator--()
{
Node=Node->_Prev;
return (*this);
}
self operator--(int)
{
iterator_node temp=(*this);
++(*this);
return temp;
}
reference operator *()
{
return (*Node)._data;
}
pointer operator->()
{
return &(operator*())
}
bool operator !=(const itreator_node temp)
{
return ((this->Node)!=(temp.Node));
}
bool operator==(const itreator_node temp)
{
return (this->Node)==(temp.Node);
}
friend ostream &operator<<( ostream &os,const self &itr)
{
os<<itr.Node->_data;
return os;
}
void operator delete[](void *tempNode)
{
delete tempNode;
}
};
template<class T>
class List
{
public:
typedef itreator_node<T,T&,T*> value_type;
typedef itreator_node<T,T&,T*> iterator;
typedef ptrdiff_t difference_type;
typedef size_t size_type;
typedef _List_Node<T>* link_type;
List():list_size(0)
{
_cur_node_ptr=_front_node_ptr=_end_node_ptr=NULL;
}
List(T *begin,T *end):list_size(0)
{
for(T *temp=begin;temp<=end;temp++)
{
if(temp==begin)
{
iterator *p1=new value_type();
p1->Node=new _List_Node<T>();
p1->Node->_data=*temp;
p1->Node->_Prev=NULL;
p1->Node->_Next=NULL;
_end_node_ptr= _front_node_ptr=p1;
}
else
{
iterator *p1=new value_type();
p1->Node=new _List_Node<T>();
p1->Node->_data=*temp;
push_back(p1);
}
list_size++;
}
iterator *p2=new value_type();
p2->Node=new _List_Node<T>();
p2->Node->_Prev=_end_node_ptr->Node;
p2->Node->_Next=NULL;
_end_node_ptr->Node->_Next=p2->Node;
_end_node_ptr=p2;
}
T &operator [](const int &i)
{
iterator temp=*_front_node_ptr;
for(int j=0;j<i;j++)
{
++temp;
}
return temp.Node->_data;
}
bool push_back(iterator *NodePtr)
{
if(NodePtr==NULL) return false;
_end_node_ptr->Node->_Next=NodePtr->Node;
NodePtr->Node->_Prev=_end_node_ptr->Node;
NodePtr->Node->_Next=NULL;
_end_node_ptr=NodePtr;
return true;
}
iterator &erase(iterator &itr)
{
--list_size;
link_type next_node=itr.Node->_Next;
link_type prev_node=itr.Node->_Prev;
if(itr==begin())
{
next_node->_Prev=NULL;
delete itr.Node;
itr.Node=next_node;
*_front_node_ptr=itr;
return itr;
}
else if(itr==end())
{
prev_node->_Next=NULL;
*_end_node_ptr=--itr;
++itr;
delete itr.Node;
itr.Node=next_node;
return itr;
}
else
{
prev_node->_Next=next_node;
next_node->_Prev=prev_node;
delete itr.Node;
itr.Node=next_node;
return itr;
}
}
size_type size() const
{
return list_size;
}
iterator begin()
{
return *_front_node_ptr;
}
iterator end()
{
return *_end_node_ptr;
}
virtual ~List()
{
};
private:
size_type list_size;
iterator *_front_node_ptr;
iterator *_end_node_ptr;
};Top
3 楼piaochen_2002(执子之手,与子偕老!)回复于 2006-03-03 11:39:19 得分 0
很早前写的代码,可能还有些问题,不自己看看吧!Top




