main.c
#include <iostream>
#include"list.h"
using namespace std;
int main()
{
CirLinkList player;
if (player.create_cirlinklist()==-1)
{
cout<<"create fail"<<endl;
return 0;
}
player.print();
if(player.length()==0)
{
cout<<"empty"<<endl;
return 0;
}
Node *current=player.get_Head();
while(player.length()>1)
{
player.del(current);
}
Node *winner=player.get_Head();
cout<<"winner is NO."<<winner->entry<<endl;
}
list.h
#ifndef LIST_H_INCLUDED
#define LIST_H_INCLUDED
typedef int Node_entry; //����һ�������������������е�������
using namespace std;
const int n=8,m=3;
struct Node
{
Node_entry entry;
Node *next;
Node();
Node(Node_entry item, Node *add_on=NULL);
};
class CirLinkList
{
public:
CirLinkList();
~CirLinkList(); //��̬����,���ڴ�,����Ա�����ͷ�
int create_cirlinklist();
int add_from_tail(Node_entry item); //�
void print(); //��ӡ���������нڵ�
void del(Node* ¤t); //�ӽڵ�node��ʼɾ����m���ڵ�
Node* get(Node* node, int index); //�ӽڵ�node��ʼ���ҵ�index���ڵ�
int length(); //��ȡ������
Node* get_Head(); //��ȡͷָ��
private:
Node* Head;
Node* Tail;
int count;
};
#endif // LIST_H_INCLUDED
list.cpp
#include <iostream>
#include"list.h"
using namespace std;
Node::Node()
{
next=NULL;
}
Node::Node(Node_entry item, Node *add_on)
{
entry=item;
next=add_on;
}
CirLinkList::CirLinkList()
{
Head=NULL;
Tail=Head;
count=0;
}
CirLinkList::~CirLinkList()
{
if(Head==NULL)
{
cout<<"empty list"<<endl;
}
else
{ Node *d=Head->next;
while(d!=Head)
{
Head->next=d->next;
delete d;
}
delete Head;
Head=NULL;
}
}
int CirLinkList::add_from_tail(Node_entry item)
{
Node *node=new Node(item);
if(node==NULL) return -1;
if(Head==NULL) Head=node;
else Tail->next=node;
Tail=node;
count++;
return 0;
}
int CirLinkList::create_cirlinklist()
{
for(int i=1;i<n+1;i++)
{
if (add_from_tail(i)==-1) return -1;
}
Tail->next=Head;
return 0;
}
void CirLinkList::print()
{ cout<<"the member of list"<<endl;
Node *p=Head;
do
{
cout<<p->entry<<endl;
p=p->next;
}while(p!=Head);
}
Node* CirLinkList::get_Head()
{
return Head;
}
int CirLinkList:: length()
{
return count;
}
Node* CirLinkList::get(Node* node, int index)
{
for (int j=0;j<index;j++)
{
node=node->next;
}
return node;
}
void CirLinkList::del(Node* &node)
{
node=get(node,m-2);
Node *temp=node->next;//delete Node temp
if(temp==Head) Head=temp->next;
if(temp==Tail) Tail=node;
node->next=temp->next;//delete Node temp
node=node->next;//go to next node
count--;
cout<<"loser is NO."<<temp->entry<<endl;
delete temp;
temp=NULL;
}