双向+头结点+循环的链表
2011-01-12 22:47
204 查看
#include<iostream> #include<string> using namespace std; class Exception { private: string mid; public: Exception( string a ):mid(a){}; string& GetString(){ return mid;} }; template<typename T > class DoubleChain; template< typename T> ostream & operator<< ( ostream & os , DoubleChain<T> & a ); template< typename T > class DoubleChainNode { friend DoubleChain<T>; friend ostream & operator<< <T>( ostream & os , DoubleChain<T> & a ); private: T data; DoubleChainNode<T> *leftLink; DoubleChainNode<T> *rightLink; }; template< typename T > class DoubleChain { friend ostream & operator<< <T>( ostream & os , DoubleChain<T> & a ); private: DoubleChainNode<T> end; int size; public: DoubleChain(){ end.rightLink = end.leftLink = &end ; size = 0 ;} ~DoubleChain(){ Clear();} bool IsEmpty()const{ return first == NULL ;} int Length()const; bool Find( int k , T &x )const; int Search( const T & x )const; void Clear(); DoubleChain<T>& Append( const T & x ); DoubleChain<T>& Delete( int k , T & x ); DoubleChain<T>& Insert( int k , const T & x ); }; template<typename T> int DoubleChain<T>::Length()const { return size; } template< typename T > bool DoubleChain<T>::Find( int k , T & x )const { DoubleChainNode<T> *p; if( k < 1 || k > size ) return false; for( p = end.rightLink ; index != k ; p = p->rightLink , ++index ); x = p->data; return true; } template< typename T> int DoubleChain<T>::Search( const T & x )const { DoubleChainNode<T> *p; int index = 1; end.data = x; for( p = end.rightLink ; p ->data != x ; p = p->rightLink , ++index ); if( p != end ) return index; else return 0; } template< typename T > void DoubleChain<T>::Clear() { DoubleChainNode<T> *p,*q; for( p = end.rightLink ; p != &end; p = q ) { q = p->rightLink; delete p; } end.leftLink = end.rightLink = &end; size = 0 ; } template< typename T > DoubleChain<T>& DoubleChain<T>::Delete( int k , T & x ) { DoubleChainNode<T> *p; if( k < 1 || k > size ) throw Exception("OutOfBound"); int index = 1; for( p = &end ; index < k ; ++index , p = p->rightLink ); DoubleChainNode<T> *q = p->rightLink; x = q->data; p->rightLink = q->rightLink; q->rightLink->leftLink = p; delete q; --size; return *this; } template<typename T> DoubleChain<T>& DoubleChain<T>::Insert( int k , const T & x ) { DoubleChainNode<T> *p; if( k < 0 || k > size ) throw Exception("OutOfBound"); int index = 0 ; for( p = &end ; index < k ; ++index ,p = p->rightLink ); DoubleChainNode<T> *q = new DoubleChainNode<T>; q->data = x; q->rightLink = p->rightLink; q->leftLink = p; p->rightLink = q; q->rightLink->leftLink = q; ++size; return *this; } template<typename T> DoubleChain<T>& DoubleChain<T>::Append( const T & x ) { DoubleChainNode<T> *p = end.leftLink; DoubleChainNode<T> *q = new DoubleChainNode<T>; q->data = x; q->leftLink = p ; q->rightLink = &end; end.leftLink = q; p->rightLink = q; } template<typename T > ostream & operator<<( ostream & os , DoubleChain<T> & a ) { DoubleChainNode<T> *p; for( p = a.end.rightLink ; p != &a.end; p = p->rightLink ) os<<p->data<<" "; return os; }
相关文章推荐
- 判断带头结点的双向循环链表L是否对称相等的算法
- 设以带头结点的双向循环链表表示的线性表L=(a1,a2,……,an)。
- 双向循环链表的建立,插入,删除(不带头结点)
- 带有头结点的双向循环链表
- 带表头结点的双向循环链表
- 含有头结点双向循环链表
- 用模板实现顺序表和带头结点的双向循环链表
- 雅虎面试题─将两个双向循环链表中data值相同的结点删除
- 线性表和带头结点的双向循环链表
- 数据结构:带头结点的双向循环链表
- 带表头结点的双向循环链表
- 带头结点的双向循环链表
- 设以带头结点的双向循环链表表示的线性表L= (a1,a2,…,an),试写一时间复杂度O(n)的算法,将L改造为 (a1,a3,…,an,…,a4,a2)。
- C++模板实现双向循环链表(有带头结点)
- 带表头结点的双向循环链表
- 带头结点的双向循环链表
- 编写算法实现建立一个带头结点的含n个元素的双向循环链表H,并在链表H中的第i个位置插入一个元素e
- 带表头结点的双向循环链表
- 【C++数据结构学习笔记---线性表】带头结点的双向循环链表
- 双向循环链表的实现(粗糙版)