输入n个数,围城一圈,输入数字m,从第一个数开始数,数到第m个数删除这个数,然后继续数,数到下一个第m个数时,删除该数,直到剩下最后一个数。输出最后一个数。
利用双向循环链表实现:
LinkNode.h
#include<iostream> using namespace std; template<typename Type>class LinkNode { public: Type m_data; LinkNode<Type>*m_next; LinkNode<Type>*m_pre; public: LinkNode(Type item):m_data(item) { m_next=this; m_pre=this; } Type GetData() { return this->m_data; } };
DoubleLink.h
#include<iostream> #include"LinkNode.h" using namespace std; #define Defaultsize 100; template<typename Type>class DoubleLink { private: LinkNode<Type>*head; int m_cursize; int m_maxsize; public: DoubleLink(Type item) { m_maxsize=Defaultsize; m_cursize=1; head=new LinkNode<Type>(item); } ~DoubleLink() { while(head->m_next!=NULL&&head->m_next!=head) { LinkNode<Type>*temp; temp=head->m_next; head->m_next=temp->m_next; delete temp; } delete head; } int GetSize() { return this->m_cursize; } bool Insert(Type item); bool Delete(Type item); int GetData(LinkNode<Type> *Node) { return Node->m_data; } Type Jsf(int m); void Print() { if(this->m_cursize==0) { cout<<"the link is empty!"<<endl; return ; } LinkNode<Type>*temp=this->head->m_next; cout<<"head ("<<head->m_data<<")-->"; while(temp!=head) { cout<<temp->m_data<<"-->"; temp=temp->m_next; } cout<<"head"<<endl; } }; template<typename Type>bool DoubleLink<typename Type>::Insert(Type item) { if(this->m_cursize==this->m_maxsize) { cout<<"the Doublelink is full!"<<endl; return 0; } LinkNode<Type>*temp=new LinkNode<Type>(item); LinkNode<Type>*p=this->head; while(p->m_next!=head) { p=p->m_next; } temp->m_next=p->m_next; p->m_next->m_pre=temp; p->m_next=temp; temp->m_pre=p; this->m_cursize++; return 1; } template<typename Type>bool DoubleLink<typename Type>::Delete(Type item) { if(this->m_cursize==0) { cout<<"the DoubleLink is empty!"<<endl; return 0; } while(this->head->m_data==item) { if(this->m_cursize==1) { cout<<"the node of item is head,can't be deleted!"<<endl; return 0; } else { this->m_cursize--; LinkNode<Type>*q=this->head->m_next; this->head->m_pre->m_next=q; q->m_pre=head->m_pre; delete head; head=q; } } LinkNode<Type>*temp=this->head,*p=this->head; while(temp->m_next!=head) { p=temp; temp=temp->m_next; if(temp->m_data==item) { this->m_cursize--; p->m_next=temp->m_next; temp->m_next->m_pre=p; delete temp; } } return 1; } template<typename Type>Type DoubleLink<typename Type>::Jsf(int m) { LinkNode<Type>*temp=this->head; int j=1; while(this->m_cursize>1) { if(j==m) { LinkNode<Type>*p=temp->m_next; if(temp==head) { head=p; } temp->m_pre->m_next=temp->m_next; temp->m_next->m_pre=temp->m_pre; delete temp; temp=p; j=1; this->m_cursize--; } else { temp=temp->m_next; j++; } } return head->m_data; }
test.cpp
#include<iostream> #include"DoubleLink.h" using namespace std; int main() { int n,m; while(cin>>n>>m) { DoubleLink<int> Link(1); for(int i=2;i<=n;i++) { Link.Insert(i); } Link.Print(); cout<<"the winner is :"<<Link.Jsf(m)<<endl; } return 0; }