1.C_Node.h文件
#ifndef C_NODE_H
#define C_Node_H
//节点类
#include <iostream>
#include <cstdio>
using namespace std;
class CList;
class CNode
{
friend class CList;
public:
CNode(int data=0,CNode *p=NULL);
~CNode(){}
private:
int data;
CNode *link;
};
CNode::CNode(int i,CNode *p)
{
data=i;
link=p;
}
#endif
2.C_List.h文件
//循环链表类
#ifndef C_LIST_H
#define C_LIST_H
#include <iostream>
#include "C_Node.h"
using namespace std;
class CList
{
public:
CList(int n); //构造函数
~CList(){}
void Add(int i); //尾插法添加节点
void Delete(int i); //删除第i个节点
int Josephus(int m,int k); //约瑟夫环
void show();
private:
CNode *first;
};
//构造函数、不带头节点、初始化n个节点、
CList::CList(int n)
{
first=NULL;
CNode *q;
int i=1;
while(n--)
{
CNode *p = new CNode(i++);
if(first==NULL)
{
first=p;
q=p;
}
else
{
q->link=p;
q=p;
}
}
q->link=first;
}
//尾插法添加值i节点
void CList::Add(int i) //添加i个成员
{
CNode *p;
while(p->link!=first)
{
p=p->link;
}
CNode *q = new CNode(i);
p->link=q;
q->link=first;
}
//删除第k个节点
void CList::Delete(int k)
{
int i=1;
if(first==NULL) {cout<<"error"<<endl;return;}
CNode *p=first;
while(i<k)
p=p->link;
CNode *q=first;
while(q->link!=p)
q=q->link;
if(q->link!=p->link)
{
q->link=p->link;
delete p;
}
else
{
first=NULL;
delete p;
}
}
int CList::Josephus(int m,int k)
{
CNode *p=first;
while(m-->1)
{
int aCircleVar=1;
while(aCircle++<k)
{
p=p->link;
}
CNode *q=first;
while(q->link!=p) q=q->link;
q->link=p->link;
p=q->link;
}
cout<<"the final one is:"<<p->data<<endl;
}
#endif
void CList::show()
{
CNode* p=first;
while(p->link!=first)
{
cout<<p->data<<' ';
p=p->link;
}
cout<<p->data<<endl;
}
3.test.cpp文件
//测试文件
#include <iostream>
#include "C_List.h"
using namespace std;
int main()
{
CList *CL = new CList(10);
CL->Josephus(10,3);
}
文本结果
the final one is:4
<1>做了一个原始版的约瑟夫环。