/*头节点的特殊处理,越过头节点*/
if(temp->next->data.no==-1){
temp=temp->next;
}
++i;
temp=temp->next;
}
/*头节点的特殊处理,越过头节点*/
if(temp->next->data.no==-1){
temp=temp->next;
}
/*输出元素并且删除节点*/
LElemType_Le;
LinkListdele=temp->next;
e=dele->data;
temp->next=dele->next;
free(dele);
printf("%d\t",e.no);
/*递归进行下一次操作*/
Joseph(temp,e.key,--flag);
}
}
intmain(intargc,char*argv[]){
LinkListmans;
InitList_L(&mans);
/*进行参数化获取数据*/
intn=0;
printf("请输入总人数n\n");
scanf("%d",&n);
/*获取指定数量的数据*/
getData(mans,n);
intm=2;
printf("请输入第一个数m\n");
scanf("%d",&m);
/*运行算法求解*/
Joseph(mans,m,n);
return0;
}
2.停车场管理
(1)问题描述
设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若停车场已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在其之后开入的车辆必须先退出停车场让路,待该辆车开出大门外,其他车辆再按原次序进入停车场,每辆停放在停车场的车在其离开停车场时必须按其停留的时间长短交纳费用。
试为停车场编制按上述要求进行管理的模拟程序。
(2)设计要求
以栈模拟停车场,以队列模拟停车场外的便道,按照从终端读入的输入数据的方式进行模拟管理。
输入1,表示车辆到达;输入2,表示车辆离开;输入3,表示显示出停车场内及便道上的停车情况;输入4,表示退出系统。
车辆到达操作,需输入汽车牌照号码及到达时间;车辆离开操作,需输入汽车在停车场的位置及离开时刻,且应输出汽车在停车场内停留的时间和应缴纳的费用(在便道上停留的时间不收费)。
(3)数据结构
本设计使用数据结构是顺序栈和链式队列。
(4)分析与实现
使用顺序栈和队列实现该程序,顺序栈来表示停车场,队列表示便道,当有车需要入库的时候首先判断车库是不是满了,满了之后就应该到队列中等候,如果没有满,那么就应该入库并且开始将入库时间记录好。
当有车出库的时候将该车入库的时间取出来,计算在库中停留的时间并输出应缴纳的停车费,此时车已经出栈,应该判断队列中是否有车等候,如果有车等候那么就将队头那辆车入库并且保存入库时间表示收费开始。
数据结构:
//每辆车存放信息
typedefstruct{
intno;//车牌号
Datetime;//时间
}DataType;
typedefstruct/*顺序栈定义*/
{
DataTypedata[MAXNUM];/*存放栈的数据元素*/
inttop;/*栈顶指针,用来存放栈顶元素在数组中的下标*/
}SeqStack;
typedefstructLQNode/*链队结点结构*/
{
DataTypeinfo;
structLQNode*next;
}LQNode;
typedefstruct/*链接队列类型定义*/
{
structLQNode*front;/*头指针*/
structLQNode*rear;/*尾指针*/
}LinkQueue;
创建新队列
LinkQueue*LQueueCreateEmpty()/*创建空链队,返回头指针*/
{
LinkQueue*plq=(LinkQueue*)malloc(sizeof(LinkQueue));
if(plq!
=NULL)
plq->front=plq->rear=NULL;
else
{
printf("内存不足!
!
\n");
returnNULL;
}
returnplq;
}
判断队列是否为空
intLQueueIsEmpty(LinkQueue*plq)/*判断链接表示队列是否为空队列*/
{
return(plq->front==NULL);
}
队列的入队
voidLQueueEnQueue(LinkQueue*plq,DataTypex)/*入链队*/
{
LQNode*p=(LQNode*)malloc(sizeof(LQNode));
if(p==NULL)
printf("内存分配失败!
\n");
else
{
p->info=x;
p->next=NULL;
if(plq->front==NULL)/*原来为空队*/
plq->front=p;
else
plq->rear->next=p;
plq->rear=p;
}
}
队列的出队
intLQueueDeQueue(LinkQueue*plq,DataType*x)/*出链队*/
{
LQNode*p;
if(plq->front==NULL)
{
printf("队列空!
!
\n");
returnERROR;
}
else
{
p=plq->front;
*x=p->info;
plq->front=plq->front->next;
free(p);
returnOK;
}
}
求队列长度
intLQueueSize(LinkQueue*LQ){
intn=0;
DataTypee;
LinkQueue*temp;
temp=LQueueCreateEmpty();
while(!
LQueueIsEmpty(LQ)){
n++;
LQueueDeQueue(LQ,&e);
LQueueEnQueue(temp,e);
}
while(!
LQueueIsEmpty(temp)){
LQueueDeQueue(temp,&e);
LQueueEnQueue(LQ,e);
}
returnn;
}
将栈置为空栈
voidSStackSetNull(SeqStack*s)/*置空栈*/
{
s->top=-1;
}
判断栈是不是为空
intSStackIsEmpty(SeqStack*s)/*判断栈S为空栈时返回值为真,反之为假*/
{
return(s->top<0?
TRUE:
FALSE);
}
判断栈是不是满了
intSStackIsFull(SeqStack*s)/*判断栈S为满栈时返回值为真,反之为假*/
{
return(s->top==MAXNUM-1?
TRUE:
FALSE);
}
入栈
intSStackPush(SeqStack*s,DataTypex)
{
if(s->top==MAXNUM-1)
{
printf("栈上溢出!
\n");
returnFALSE;
}
else
{
s->top=s->top+1;
s->data[s->top]=x;
returnTRUE;
}
}
出栈
intSStackPop(SeqStack*s,DataType*x)
{
if(s->top==-1)
{
printf("栈下溢出!
\n");
returnFALSE;
}
else
{
*x=s->data[s->top];
s->top--;
returnTRUE;
}
}
显示栈中的元素数量
/*返回当前堆栈中元素的数量*/
intSqStackSize(SeqStack*CheKu){
intn=0;
DataTypeoldcar;
SeqStackTemp;
SStackSetNull(&Temp);
//计数
while(!
SStackIsEmpty(CheKu)){
n++;
SStackPop(CheKu,&oldcar);
SStackPush(&Temp,oldcar);
}
while(!
SStackIsEmpty(&Temp)){
SStackPop(&Temp,&oldcar);
SStackPush(CheKu,oldcar);
}
returnn;
}
打印停车场中的所有车
voidSStackPrint(SeqStack*s)
{
intp;
if(SStackIsEmpty(s)==TRUE)
printf("车库是空的!
\n");
else
{
printf("-------\n");
p=0;
while(p<=s->top)
{
printf("|﹀%d%d/%d\n",s->data[p].no,s->data[p].time.day,s->data[p].time.hour);
p++;
}
printf("\n");
}
}
停车函数
/*停车函数*/
voidpark(SeqStack*CheKu,LinkQueue*DuiLie,DataTypecar)
{
//首先判断车库是不是空的
if(SStackIsFull(CheKu)){
//车库已经满了,那么应该进入队列等候
LQueueEnQueue(DuiLie,car);
printf("当前车库已经满了,车辆进入便道等候\n");
}else{
//车库没有满就直接让车进入车库
SStackPush(CheKu,car);
printf("车辆已经进入车库同时按照输入的时间开始计费\n");
}
}
取车函数
/*取车函数*/
voidunPark(SeqStack*CheKu,LinkQueue*DuiLie,DataTypecar){
SeqStackTemp;
SStackSetNull(&Temp);
DataTypeoldcar;
Datetime=car.time;
while(!
SStackIsEmpty(CheKu)){
SStackPop(CheKu,&oldcar);
//查找目标车辆
if(oldcar.no!
=car.no){
//非目标车辆压入临时库
SStackPush(&Temp,oldcar);
}else{
//找到目标车后输出
intday=time.day-oldcar.time.day;
inthour=time.hour-oldcar.time.hour;
if(hour<0){
day--;
hour=24+hour;
}
printf("车%d出库停留时间%dd%dh应缴纳费用¥%d\n",oldcar.no,day,hour,(24*day+hour)*PRICE);
}
}
//将所有车辆放回库中
while(!
SStackIsEmpty(&Temp)){
SStackPop(&Temp,&oldcar);
SStackPush(CheKu,oldcar);
}
//此时车库应该是有空位的如果队列中有车那么应该将一辆车从便道移动到车库
if(!
LQueueIsEmpty(DuiLie)){
LQueueDeQueue(DuiLie,&oldcar);
oldcar.time=time;
SStackPush(CheKu,oldcar);
printf("队列中的%d已经移动到库中开始计时的时间是%d/%d\n",oldcar.no,oldcar.time.day,oldcar.time.hour);
}
}
显示当前停车场的状态
/*显示系统状态*/
voidshowsta(SeqStack*CheKu,LinkQueue*DuiLie){
intn=0;
n=SqStackSize(CheKu);
if(!
SStackIsFull(CheKu)){
printf("\n车库是有空位的\t空位有:
%d个\n",MAXNUM-n);
}else{
printf("\n车库已经满了!
便道有%d辆车等候\n",LQueueSize(DuiLie));
}
}
显示当前便道的等待状态
voidshowLQ(LinkQueue*LQ){
DataTypee;
LinkQueue*temp;
temp=LQueueCreateEmpty();
printf("队列:
\n");