1 /////////////////////////////////////////////////////////////////////////////// 2 // 3 // FileName : clist.h 4 // Version : 0.10 5 // Author : Ryan Han 6 // Date : 2013/06/25 10:05:10 7 // Comment : 8 // 9 /////////////////////////////////////////////////////////////////////////////// 10 #ifndef __CIRC_LIST_H__ 11 #define __CIRC_LIST_H__ 12 13 #include "slist.h" 14 15 16 template <typename T> 17 class CCList : public CSList<T> 18 { 19 public: 20 using CSList<T>::m_nCount; 21 using CSList<T>::m_pNodeHead; 22 23 protected: 24 CNode<T> *m_pNodeCurr; 25 26 public: 27 CCList(); 28 29 public: 30 T& GetNext(); 31 void RemoveAt(const int pos); 32 int GetCurrentIndex() const; 33 }; 34 35 template <class T> 36 inline CCList<T>::CCList() 37 { 38 } 39 40 template <typename T> 41 inline T& CCList<T>::GetNext() 42 { 43 ASSERT(0 != m_nCount); 44 45 if((NULL == m_pNodeCurr) || (NULL == m_pNodeCurr->next)) 46 m_pNodeCurr = m_pNodeHead; 47 else 48 m_pNodeCurr = m_pNodeCurr->next; 49 50 return m_pNodeCurr->data; 51 } 52 53 template <typename T> 54 inline int CCList<T>::GetCurrentIndex() const 55 { 56 ASSERT(0 != m_nCount); 57 58 int i; 59 CNode<T> *pTmpNode = m_pNodeHead; 60 61 for(i = 1; i <= m_nCount; ++i) 62 { 63 if(pTmpNode == m_pNodeCurr) 64 return i; 65 else 66 pTmpNode = pTmpNode->next; 67 } 68 69 return 0; 70 } 71 72 template <typename T> 73 inline void CCList<T>::RemoveAt(const int pos) 74 { 75 ASSERT(1 <= pos && pos <= m_nCount); 76 77 int i; 78 CNode<T> *pTmpNode1; 79 CNode<T> *pTmpNode2; 80 81 pTmpNode1 = m_pNodeHead; 82 83 //head node? 84 if(1 == pos) 85 { 86 if(m_pNodeCurr == m_pNodeHead) 87 m_pNodeCurr = NULL; 88 m_pNodeHead = m_pNodeHead->next; 89 goto Exit1; 90 } 91 92 for(i = 1; i < pos; ++i) 93 { 94 pTmpNode2 = pTmpNode1; 95 pTmpNode1 = pTmpNode1->next; 96 } 97 pTmpNode2->next = pTmpNode1->next; 98 99 m_pNodeCurr = pTmpNode2; 100 101 Exit1: 102 delete pTmpNode1; 103 --m_nCount; 104 } 105 106 /* 107 template <typename T> 108 inline CCList<T>::~CCList() : m_pNodeCurr(NULL) 109 { 110 } 111 */ 112 113 #endif
/////////////////////////////////////////////////////////////////////////////// // // FileName : joseph.cpp // Version : 0.10 // Author : Ryan Han // Date : 2013/06/26 12:55:13 // Comment : // /////////////////////////////////////////////////////////////////////////////// #include "clist.h" #include <iostream> using namespace std; int main() { int i; int n; int m; int nNumber; int nCurIndex; CCList<int> clist; //#ifdef _DEBUG // _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); //#endif cout << "Please input the number of person: "; cin >> n; cout << "Please enter the deatch number: "; cin >> m; for(i = 1; i <= n; ++i) { clist.AddTail(i); } i = 0; do { ++i; nNumber = clist.GetNext(); if(i == m) { cout << "The " << nNumber << " is removed." << endl; nCurIndex = clist.GetCurrentIndex(); clist.RemoveAt(nCurIndex); --n; i = 0; } }while(1 != n); cout << "The last number left is: " << clist.GetHead() << endl; }