/*(1).问题描述:
n个人从左向右编号1~n,然后从左向右报数“1,2,1,2,1,2...”
数到1的人出队,数到2的人立即站到队列的最右端
继续报数,直到所有人出列
(2) 数据组织:用一个队列解决出列问题,由于这里不需要已经出队后的元素,所以采用环形队列?????
(3)设计算法:
1.全部入队
2.出队一个,输出编号
3.若队列不为空,再出队一个元素,并将刚出列的元素进队到队尾
*/
#include <stdio.h>
#include <malloc.h>
#define maxsize 10//不能开辟8个因为在用环形队列时maxsize=0时被舍弃了
typedef struct
{
int date[maxsize];
int front,rear;
}sqqueue;
void initqueue(sqqueue *&q)
{
q=(sqqueue *)malloc(sizeof(sqqueue));
q->front=q->rear=0;
}
bool enqueue(sqqueue *&q,int e)
{
if((q->rear+1)%maxsize==q->front)
return false;
q->rear=(q->rear+1)%maxsize;
q->date[q->rear]=e;
return true;
}
bool dequeue(sqqueue *&q,int &e)
{
if(q->front==q->rear)
return false;
q->front=(q->front+1)%maxsize;
e=q->date[q->front];
return true;
}
bool queueempty(sqqueue *q)
{
return (q->front==q->rear);
}
void destoryqueue(sqqueue *q)
{
free(q);
}
void number(int n)
{
int e;
sqqueue *q;
initqueue(q);
for(int i=1;i<=n;++i)
enqueue(q,i);
printf("报数出列顺序:");
while(q->front!=q->rear)//z这行后面开始多加了一个逗号,造成死循环。下面的程序是没有错误的
{
dequeue(q,e);
printf("%d",e);
if(!queueempty(q))
{
dequeue(q,e);
enqueue(q,e);
}
}
/* int m=8;
while(m--)
{
dequeue(q,e);
printf(" %d",e);
dequeue(q,e);
enqueue(q,e);
}*/
printf("\n");
destoryqueue(q);
}
int main()
{
int n=8;
printf("初始序列:\n");
for(int i=1;i<=n;++i)
printf(" %d",i);
printf("\n");
number(n);
return 0;
}
#include <stdio.h>
#include <malloc.h>
#define Maxsize 8
typedef struct
{
int date[Maxsize];
int front,rear;
}SqQueue;
void num(int n)
{
int i,e;
SqQueue q;
q.front=q.rear=0;
for(i=1;i<=n;i++)
{
q.rear=(q.rear+1)%Maxsize;
q.date[q.rear]=i;
}
printf("报数出列顺序");
while(q.front!=q.rear)
{
q.front=(q.front+1)%Maxsize;
e=q.date[q.front];
printf("%d",e);
if(q.front!=q.rear)
{
q.front=(q.front+1)%Maxsize;
e=q.date[q.front];
q.rear=(q.rear+1)%Maxsize;
q.date[q.rear]=e;
}
}
printf("\n");
}
int main()
{
int i,n=8;
printf("初始序列");
for(i=1;i<=n;i++)
{
printf("%d",i);
}
printf("\n");
num(n);
return 0;
}