#include
using namespace std;
typedef struct Node
{
int data;
struct Node * next;
}Lnode,*LinkList;
LinkList Creat(int num){
LinkList L;
Lnode *s,*r,*head;
int i=1;
L=r=NULL;
while(1){
s=new Lnode;
s->data=i;
i++;
if(L==NULL)
{ L=s;
head=L;
}
else
r->next=s;
r=s;
if(i==num+1)break;
}
r->next=head;
return L;
}
int out(LinkList L,int num,int step){
Lnode *p,*s,*n;
p=L;
for(int i=1;i<=num;i++)
{
int count=1;
//用count定位到第m个人,循环后,p1指向这个人,p2指向这个人的上一个人
while(count++<=step)
{
s=p;
p=p->next;
}
cout<
n=p;//p指向当前这个人
s->next=p->next;//把当前的人前的人和当前的人后的人连上.
p=p->next;//下次从当前的人的下一个人开始数
delete n;//把这个人删除(就是释放这块内存)
}
/*
int i=0;
while(1){
for(int j=0;j
s=p;
p=p->next;
s=p->next;
cout<
i++;
if(i==num)break;
}*/
return 0;
}
void get(LinkList L,int step){
Lnode *p,*s;
p=L;
p=p->next;
p=s;
p=p->next;
s->next=p->next;
cout<
delete p;
}
int main(){
LinkList L;
int num,step;
cin>>num>>step;
L=Creat(num);
out(L,num,step);
//get(L,step);
return 0;
}
我给一个我以前写的代码
//CircleList.h
template
template
{
friend class CircleList
private:
Type data;
ListNode
public:
ListNode():next(NULL) {};
ListNode(Type &e):data(e),next(NULL){};
Type & GetData() {return data;}
ListNode
void SetNodeData(Type &e){data=e;}
void SetNodePtr(ListNode
};
template
class CircleList
{
private:
ListNode
public:
CircleList(){head=new ListNode
~CircleList(){CircleClear(); delete head;}
void CircleClear();
ListNode
ListNode
bool CircleListInsertAfter(int i,Type &e);
ListNode
};
template
void CircleList
{
ListNode
while(head->next!=head)
{
p=head->next;
head->next=p->next;
delete p;
}
}
template
ListNode
{
if(p==NULL) return head;
ListNode
if(q==head) q=q->next;
return q;
}
template
ListNode
{
ListNode
if(q==head)
{
q=q->next;
head->next=q->next;
}
else
p->next=q->next;
return q;
}
template
bool CircleList
{
ListNode
p=ListGetElem(i);
if(!p) return false;
s=new ListNode
s->next=p->next;
p->next=s;
return true;
}
template
ListNode
{
if(i<0) return NULL;
if(i==0) return head;
ListNode
int j=1;
while(j {
p=p->next;
if(p==head) p=p->next;
j++;
}
return p;
}
//main.cpp
#include
#include "CircleList.h"
using namespace std;
template
void Josephus(CircleList
{
ListNode
current=clist.ListNextElem();
for(int i=1;i<=n-1;i++)
{
for(int j=1;j<=m-1;j++)
current=clist.ListNextElem(current);
p=clist.CircleListRemove(current);
cout<<"删除顺序:"<
}
current=clist.ListNextElem();
p=clist.ListNextElem(current);
cout<<"最后剩下:"<
int main()
{
int a[]={1,2,3,4,5,6,7,8,9,10};
CircleList
for(int i=0;i<10;i++)
la.CircleListInsertAfter(i,a[i]);
Josephus(la,10,4);
return 0;
}
我找的程序,不知道对不对..
void JOSEPHUS(int n,int k,int m) //n为总人数,k为第一个开始报数的人,m为出列者喊到的数
{
/* p为当前结点 r为辅助结点,指向p的前驱结点 list为头节点*/
LinkList p,r,list;
/*建立循环链表*/
for(int i=0,i
p=(LinkList)malloc(sizeof(LNode));
p->data=i;
if(list==NULL)
list=p;
else
r->link=p;
r=p;
}
p>link=list; /*使链表循环起来*/
p=list; /*使p指向头节点*/
/*把当前指针移动到第一个报数的人*/
for(i=0;i
r=p;
p=p->link;
}
/*循环地删除队列结点*/
while(p->link!=p)
{
for(i=0;i
r=p;
p=p->link;
}
r->link=p->link;
printf("被删除的元素:%4d ",p->data);
free(p);
p=r->link;
}
printf("\n最后被删除的元素是:%4d",P->data);
}