以前做约瑟夫环的代码 以后用就可以直接用啦
用队列做的 就是队尾指向队首
#include<stdio.h>
#include<deque>
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
int a,b,i,n;
deque<int>q;
scanf("%d %d",&a,&b);
for(i=1;i<=a;i++)
q.push_back(i);
for(n=1;n<a;n++)
{
for(i=1;i<b;i++)
{
q.push_back(q.front());
q.pop_front();
}
q.pop_front();
}
printf("%d",q.front());
return 0;
}
整理出一个链表写的约瑟夫环
#include <iostream>
#include<stdio.h>
#include<malloc.h>
using namespace std;
typedef struct Node
{
int data;
struct Node *next;
}ListNode,*LinkList;
LinkList CreateCycList(int n);/*创建一个长度为n的循环单链表*/
void Josephus(LinkList head,int n,int m,int k); /*长度为n的循环单链表中,报数为编号为m的出列*/
int main()
{
LinkList h;
int n,k,m;
printf("输入环中人的个数n=");
scanf("%d",&n);
printf("输入开始报数的序号k=");
scanf("%d",&k);
printf("报数为m的人出列m=");
scanf("%d",&m);
h=CreateCycList(n);
Josephus(h,n,m,k);
return 0;
}
void Josephus(LinkList head,int n,int m,int k)
{
ListNode *p,*q;
int i;
p=head;
for(i=1;i<k;i++)/*从第k个人开始报数,将p先移到这个位置,准备开始*/
{
q=p;
p=p->next;
}
while(p->next!=p)/*开始报数....*/
{
for(i=1;i<m;i++)/*数到m的人出列*/
{
q=p;
p=p->next;
}
q->next=p->next;/*q作为辅助[衔接]p左右的两个结点,等价于删除p*/
printf("%4d",p->data);
free(p);/*释放结点p*/
p=q->next; /*p指向下一个结点,重新开始报数*/
}
putchar('\n');
printf("%4d\n",p->data);/*只剩最后一个结点!*/
}
LinkList CreateCycList(int n)
{
LinkList head=NULL;
ListNode *s,*r;
int i;
for(i=1;i<=n;i++)
{
s=(ListNode*)malloc(sizeof(ListNode));
s->data=i;
s->next=NULL;
if(head==NULL)
head=s;
else
r->next=s;
r=s;
}
r->next=head;
return head;
}