1. 程式人生 > >有n個人圍成一圈,從第1個人開始,1、2、3報數,報至3出局,餘下的人繼續從1、2、3報數,問:最後剩下的一人是原來的第幾號?同時求出被淘汰編號的序列。(要求:用迴圈佇列解決該問題。)

有n個人圍成一圈,從第1個人開始,1、2、3報數,報至3出局,餘下的人繼續從1、2、3報數,問:最後剩下的一人是原來的第幾號?同時求出被淘汰編號的序列。(要求:用迴圈佇列解決該問題。)

han.h:
#include <iostream>
#include <stdlib.h>
#include "Status.h"
using namespace std;

typedef struct QNode
{
ElemType data;
struct QNode *next;
}QNode,*QueuePtr;


typedef struct 
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;

Status InitQueue(LinkQueue &Q)
{
Q.front = Q.rear=new QNode;


if(!Q.front)
{
exit(OVERFLOW);
}
Q.front->next = NULL;
return OK;
}


Status EnQueue(LinkQueue &Q,ElemType e)
{
QueuePtr p;
p = new QNode;
if(!p)
exit(OVERFLOW);
p -> data = e;
p -> next = NULL;
Q.rear->next = p;
Q.rear = p;
return OK;
}


Status DeQueue(LinkQueue &Q,ElemType &e)
{
QueuePtr p;
p = new QNode;
p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if(Q.rear == p)
{
Q.rear = Q.front;
}
delete p;
return OK;
}


void Main(LinkQueue &Q,int n,int e)
{
Q.front = Q.front->next;
Q.rear->next = Q.front;
int j;
bool flag = false;
cout<<"淘汰編號的序列"<<endl;
while(n != 1)
{
j = 1;
if(flag == false)
{
for(j = 1;j<2;j++)
{
Q.front = Q.front->next;
flag = true;
}
}
else
{
for(j = 1;j<3;j++)
{
Q.front = Q.front->next;
}
}
DeQueue(Q,e);
cout<<e<<" ";
n--;
}
cout<<endl;
cout<<"最後剩下的一人是原來的第"<<Q.front->data<<"號"<<endl;
}