📄 p88.cpp
字号:
#include <stdio.h> #include <iostream.h> template <class Type> class DblList; template <class Type> class DblNode { friend class DblList<Type>; private: Type data; //链表结点数据 DblNode<Type> *lLink, *rLink; //链表前驱(左链)、后继(右链)指针 DblNode ( Type value, DblNode<Type> *left, DblNode *right ) : data (value), lLink (left), rLink (right) { } //构造函数 DblNode ( Type value ) : data (value), lLink (NULL), rLink (NULL) { } //构造函数 }; template <class Type> class DblList { public: DblList ( Type uniqueVal ); //构造函数: 建立双向循环链表的表头结点。 ~DblList ( ); //析构函数: 释放双向循环链表所用存储。 int Length ( ) const; //计算双向循环链表的长度。 int IsEmpty ( ) { return first->rLink == first; } //判双向循环链表空否 int Find ( const Type & target ); //在链表中寻找等于给定值的结点。 Type getData ( ) const ; //返回当前结点中存储的值。 void Firster ( ) { current = first; } //初始化: 将当前指针指到表头结点。 int First ( ); //当前指针指向链表表头结点。 int Next ( ); //当前指针指到当前结点的后继结点。 int Prior ( ); //当前指针指到当前结点的前驱结点。 int operator ! ( ) { return current != NULL; } //重载操作符: 判当前指针current空否 void Insert ( const Type & value ); //插入一个包含有值value的新结点。 void Remove ( ); //删除当前结点。 void Print (); private: DblNode<Type> *first, *current; }; template <class Type> DblList<Type>::DblList ( Type uniqueVal ) { //构造函数: 建立双向循环链表的表头结点, 它包含了一个用于某些特定情况的值。 first = new DblNode<Type> ( uniqueVal ); first->rLink = first->lLink = first; current = NULL; } template <class Type> DblList<Type>::~DblList() { current = first->rLink; while ( current != first ) { current = current->lLink; delete current->lLink; } delete first; } template <class Type> int DblList<Type>::Length ( ) const { //计算带表头结点的双向循环链表的长度, 通过函数返回。 DblNode<Type> * p = first->rLink; int count = 0; while ( p != first ) { p = p->rLink; count++; } return count; } template <class Type> int DblList<Type>::Find ( const Type & target ) { //在带表头结点的双向循环链表中寻找其值等于target的结点, 若找到, 则函数返回1, 同时current指针 //指向该结点, 否则函数返回0。 DblNode<Type> *p = first->rLink; while ( p != first && p->data != target ) p = p->rLink; //寻找含target的结点 if ( p != first ) { current = p; return 1; } //搜索成功, 返回1 return 0; //没有找到, 返回0 } template <class Type> Type DblList<Type>::getData () const { if ( current == NULL ) return first->data; else return current->data; } template <class Type> int DblList<Type>::First ( ) { //若链表非空, 则将当前指针指向链表的第一个结点且函数返回1; 若链表空, 则令当前指针为NULL且 //函数返回0。 if ( !IsEmpty ( ) ) { current = first->rLink; return 1; } current = NULL; return 0; } template <class Type> int DblList<Type>::Next ( ) { //若当前结点有后继结点, 则当前指针指到当前结点的后继结点且函数返回1, 否则令当前指针为NULL //且函数返回0。 if ( current->rLink == first ) { current = NULL; return 0; } current = current->rLink; return 1; } template <class Type> int DblList<Type>::Prior ( ) { //若当前结点有前驱结点, 则当前指针指到当前结点的前驱结点且函数返回1; 否则令当前指针为NULL //且函数返回0。 if ( current->lLink == first ) { current = NULL; return 0; } current = current->lLink; return 1; } template <class Type> void DblList<Type>::Insert ( const Type & value ) { //建立一个包含有值value的新结点, 并将其插入到当前结点之后。 if ( current == NULL ) //原为空表 current = first->rLink = new DblNode<Type> ( value, first, first ); else { //原为非空表 current->rLink = new DblNode<Type> ( value, current, current->rLink ); current = current->rLink; //新结点成为当前结点 } current->rLink->lLink = current; //完成重新链接 } template <class Type> void DblList<Type>::Remove ( ) { //在带表头结点的双向循环链表中删除当前结点, 同时让当前指针指到链表中的下一个结点, 若被删结点 //是链表最后一个结点, 则让当前指针指到表中最前端第一个结点。如果删除后链表变成空链表, 则令当 //前指针为NULL。 if ( current != NULL ) { DblNode<Type> *temp = current; current = current->rLink; //当前指针指到下一结点 current->lLink = temp->lLink; //将被删结点从链中摘下 temp->lLink->rLink = current; delete temp; //删除 if ( current == first ) if ( IsEmpty ( ) ) current = NULL; //删后链表变空 else current = current->rLink; } } template <class Type> void DblList<Type>::Print ( ) { if ( first->rLink == first ) cout << "It is empty" << endl; else { DblNode<Type> * temp = first; while ( temp->rLink != first ) { temp = temp->rLink; cout << temp->data << " " ; } cout << endl; } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -