队列报数问题
参考书:《数据结构(C语言)》–严蔚敏等编著,清华大学出版社。
要求:
设有n个人站成一排,从左向右的编号分别为1~n,
现在从左往右报数“1,2,1,2……”,数到“1”的人离开队列,
数到“2”的人立即站到队伍的最右端。
报数过程反复进行,直到这n个人都离开队列为止,
最后输出他们的出列顺序。
输入:8
输出:1 3 5 7 2 6 4 8
输入:11
输出:1 3 5 7 9 11 4 8 2 10 6
相关代码:
#include "stdio.h"
#include "stdlib.h"
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
typedef int Status;
typedef int QElemType;
typedef struct QNode {
QElemType data;
struct QNode *next;
} QNode, *QueuePtr;
typedef struct {
QueuePtr front; //队头指针
QueuePtr rear; //队尾指针
} LinkQueue;
Status InitQueue(LinkQueue &Q);
//构造一个空队列Q
Status InitQueue(LinkQueue &Q) {
Q.front = Q.rear = new QNode;
if(!Q.front) exit(OVERFLOW);
Q.front->next = NULL; //将Q.front(Q.rear同)指向NULL
return OK;
}
Status EnQueue(LinkQueue &Q,QElemType e);
//入队,e为Q的新的队尾元素
Status EnQueue(LinkQueue &Q,QElemType e) {
QueuePtr p;
p = new QNode;
if(!p) exit(OVERFLOW);
p->data = e;
p->next = NULL;
Q.rear->next = p; //Q.rear所指向的是队尾,入队的元素在队尾,所以将Q.rear的next指向p
Q.rear = p; //更新Q.rear队尾指针指向队尾元素p
return OK;
}
Status DeQueue(LinkQueue &Q,QElemType &e);
//出队,用e返回其值,删除队头节点
Status DeQueue(LinkQueue &Q,QElemType &e) {
if(Q.front == Q.rear) return ERROR;
QueuePtr p;
p = Q.front->next; //Q.front所指向的是队头,所以将队头交给p(待删除的)
e = p->data;
Q.front->next = p->next;
if(Q.rear == p) Q.front = Q.rear; //若只有一个元素出队,那么出队后就是空队列
return OK;
}
Status QueueEmpty(LinkQueue Q);
Status QueueEmpty(LinkQueue Q) {
if(Q.front == Q.rear)
return TRUE;
else
return FALSE;
}
int main(void) {
LinkQueue Q;
InitQueue(Q);
int i,n,e;
int count=1; //标记
printf("请输入排队人数:");
scanf("%d",&n);
printf("报数后的排列结果为:\n");
for(i=1; i<=n; i++)
EnQueue(Q,i);
while(!QueueEmpty(Q)) {
DeQueue(Q,e);
if(count%2 == 1)
printf("%d ",e);
else
EnQueue(Q,e);
count++;
}
return 0;
}