高分求解c++约瑟夫环问题

2025-01-06 08:05:57
推荐回答(3个)
回答1:

#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<data<<" ";//输出当前人的编号
n=p;//p指向当前这个人
s->next=p->next;//把当前的人前的人和当前的人后的人连上.
p=p->next;//下次从当前的人的下一个人开始数
delete n;//把这个人删除(就是释放这块内存)
}
/*
int i=0;
while(1){
for(int j=0;jp=p->next;
s=p;
p=p->next;
s=p->next;
cout<data<<" ";

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<data;
delete p;
}
int main(){
LinkList L;
int num,step;
cin>>num>>step;
L=Creat(num);
out(L,num,step);
//get(L,step);
return 0;
}

回答2:

我给一个我以前写的代码
//CircleList.h
template class CircleList;
template class ListNode
{
friend class CircleList;
private:
Type data;
ListNode *next;
public:
ListNode():next(NULL) {};
ListNode(Type &e):data(e),next(NULL){};
Type & GetData() {return data;}
ListNode * GetNodePtr() {return next;}
void SetNodeData(Type &e){data=e;}
void SetNodePtr(ListNode * ptr){next=ptr;}
};

template
class CircleList
{
private:
ListNode *head;
public:
CircleList(){head=new ListNode; head->next=head;}
~CircleList(){CircleClear(); delete head;}

void CircleClear();
ListNode * ListNextElem(ListNode *p=NULL);
ListNode * CircleListRemove(ListNode *p);
bool CircleListInsertAfter(int i,Type &e);
ListNode * ListGetElem(int i) const;
};

template
void CircleList::CircleClear()
{
ListNode *p;
while(head->next!=head)
{
p=head->next;
head->next=p->next;
delete p;
}
}

template
ListNode * CircleList::ListNextElem(ListNode *p)
{
if(p==NULL) return head;
ListNode *q=p->next;
if(q==head) q=q->next;
return q;
}

template
ListNode * CircleList::CircleListRemove(ListNode *p) //删除p指针指向结点的直接后继
{
ListNode *q=p->next;
if(q==head)
{
q=q->next;
head->next=q->next;
}
else
p->next=q->next;

return q;
}

template
bool CircleList::CircleListInsertAfter(int i,Type &e)
{
ListNode *p,*s;
p=ListGetElem(i);
if(!p) return false;

s=new ListNode(e);
s->next=p->next;
p->next=s;

return true;
}

template
ListNode * CircleList::ListGetElem(int i) const
{
if(i<0) return NULL;
if(i==0) return head;
ListNode *p=head->next;
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 &clist,int n, int m)
{
ListNode *p,*current;
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<<"删除顺序:"<GetData()< delete p;
}
current=clist.ListNextElem();
p=clist.ListNextElem(current);
cout<<"最后剩下:"<GetData()<}

int main()
{
int a[]={1,2,3,4,5,6,7,8,9,10};
CircleList la;
for(int i=0;i<10;i++)
la.CircleListInsertAfter(i,a[i]);

Josephus(la,10,4);
return 0;
}

回答3:

我找的程序,不知道对不对..

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);
}