p82.cpp
上传用户:chaiyuqiu
上传日期:2022-08-03
资源大小:27k
文件大小:3k
源码类别:

数据结构

开发平台:

C/C++

  1. #include <stdio.h>
  2.                 #include <iostream.h>
  3. enum Boolean { False, True };
  4. template <class Type> class CircList;
  5. template <class Type> class CircListNode {
  6. friend class CircList<Type>;
  7. public:
  8.    CircListNode ( Type d=0, CircListNode<Type> *next=NULL ) : data (d), link (next) { }
  9. private:
  10.    Type data;
  11.    CircListNode<Type> *link;
  12. };
  13. template <class Type> class CircList {
  14. public:
  15.    CircList ();
  16.    CircList ( Type value ); //构造函数
  17.    ~CircList ( ); //析构函数
  18.    int Length ( ) const; //计算循环链表长度
  19.    Boolean IsEmpty ( ) { return first->link == first; } //判表空否
  20.    Boolean Find ( const Type & value ); //在循环链表中寻找其值等于value的结点
  21.    Type getData ( ) { return current->data; } //返回当前结点中存放的值
  22.    Type getNextData () ;
  23.    void Firster ( ) { current = first; } //将当前指针置于头结点
  24.    void First ( ); //将当前指针指向链表的第一个结点
  25.    void Next ( ); //将当前指针指到当前结点的后继结点
  26.    void Prior ( ); //将当前指针指到当前结点的前驱结点
  27.    void Insert ( const Type & value ); //插入新结点
  28.    void RemoveNext ( );
  29.    void Josephus ( int n, int m ); //删除当前结点
  30. private:
  31.    CircListNode<Type> *first, *current, *last; //头指针, 当前指针, 尾指针
  32. };
  33. template <class Type> void CircList <Type> :: CircList () {
  34.     current = last = first = new CircListNode<Type> ();
  35.     first->link = first;
  36. }
  37. template <class Type> void CircList <Type> :: ~CircList () {
  38.     CircListNode<Type> *q;
  39.     while ( first->link != first ) {
  40. q = first->link;   first->link = q->link;
  41. delete q;
  42.     }
  43.     delete first;  current = first = last = NULL;
  44. }
  45. template <class Type> void CircList <Type> :: Next () {
  46.     if ( current->link == first ) current = first;
  47.     current = current->link;
  48. }
  49. template <class Type> Type CircList <Type> :: getNextData() {
  50.     if ( current->link == first ) return first->link->data;
  51.        else return current->link->data;
  52. }
  53. template <class Type> void CircList <Type> :: RemoveNext () {
  54.     CircListNode<Type> *p = current->link;
  55.     if ( p == last ) last = current;
  56.     if ( p != first ) current->link = p->link;
  57. else { p = first->link; first->link = p->link; }
  58.     delete p;
  59. }
  60. template <class Type> void CircList <Type> :: Insert (const Type & value) {
  61.     CircListNode<Type> *p = new CircListNode<Type> ( value, first );
  62.     last = last->link = p;
  63. }
  64. template <class Type> void CircList <Type> :: Josephus ( int n, int m ) {
  65.    for ( int i=0; i<n-1; i++ ) {       //循环n-1趟,让n-1个人出列
  66.  for ( int j=0; j<m-1; j++ ) Next ( );    //让current向后移动m-1次
  67.  cout << "Delete person " << getNextData ( ) << endl;
  68.  RemoveNext ( );  //删去该结点,让current指示下一结点
  69.    }
  70.    cout << "the winner is : " << getData () << endl;
  71. }