📄 park.c
字号:
t->data=p;
t->next=NULL;
W1->rear1->next=t;
W1->rear1=t;
q=W1->head1;
while(q!=t)
{
q=q->next;
j++;
}
printf("\n避风港已满,该船须在等待区的第%d号位置等待片刻!\n",j);
return OK;
}
}
//-----------------------------------------------------------------------------------------
//(2)轮船离开模块
//轮船离开短暂靠港区函数
void Leave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W)
{
int i,room,j,n;
int A1,A2,B1,B2;
char carno[10];
CarNode *p,*t;
QueueNode *q;
//判断短暂靠港区内是否有轮船
for(n=0;n<=MAX;n++)
{
if(Enter->stack[n]!=NULL)
{
n=MAX+1;
while(1) //输入离开轮船的信息
{
flushall();//清除所有缓冲区
printf("\n请输入准备离开的轮船船牌号:");
gets(carno);
room=0;
for(i=0;i<=MAX;i++)
{
j=stricmp(carno,Enter->stack[i]->num); //查找准备离开的轮船号
if(j==0)
{
room=i;
break;
}
}
if(room>=0&&room<=MAX)
break;
printf("\n短暂靠港区里没有此船牌号的轮船,请重新输入!");
}
p=Enter->stack[room];
Enter->stack[room]=NULL;
printf("\n请输入离开的时间:/Hour:Minute/");
scanf("%d:%d",&(p->leave.hour),&(p->leave.min));
printf("\n离开轮船的船牌号为:");
puts(p->num);
printf("\n此船的到达时间为: %d:%d",p->reach.hour,p->reach.min);
printf("离开时间为: %d:%d",p->leave.hour,p->leave.min);
A1=p->reach.hour;
A2=p->reach.min;
B1=p->leave.hour;
B2=p->leave.min;
printf("\n此船应交费用为: %2.1f元",((B1-A1)*60+(B2-A2))*price);
free(p);
//判断等待区上是否有轮船及短暂靠港区是否已满
if(W->head!=W->rear) //等待区的轮船进入短暂靠港区
{
q=W->head->next;
t=q->data;
for(n=0;n<=MAX;n++)
{
if(Enter->stack[n]!=NULL)
{
printf("\n等待区的%s号轮船进入避风港第%d号位置.\n",t->num,n+1);
t->reach.hour=B1;
t->reach.min=B2;
W->head->next=q->next;
if(q==W->rear)
W->rear=W->head;
Enter->stack[n]=t;
free(q);
n=MAX+1;
}
}
if(n==MAX+1)
printf("短暂靠港区已满!\n");
}
if(W->head==W->rear)
printf("\n等待区里没有轮船.\n");
}
}
if(n==MAX+1)
printf("\n短暂靠港区里没有船.\n"); //短暂靠港区没有轮船;
}
//-----------------------------------------------------------------------------------------
//轮船离开避风港函数
void Leave1(SeqStackCar1 *Enter1,SeqStackCar1 *Temp1,LinkQueueCar1 *W1)
{
int i,room,j;
int A1,A2,A3,B1,B2,B3;
char carno[10];
CarNode1 *p,*t;
QueueNode1 *q;
//判断短暂靠港区内是否有轮船
if(Enter1->top>0) //有轮船
{
while(1) //输入离开轮船的信息
{
flushall();//清除所有缓冲区
printf("\n请输入轮船船牌号:");
gets(carno);
room=0;
for(i=1;i<=Enter1->top;i++)
{
j=stricmp(carno,Enter1->stack1[i]->num); //查找准备离开的轮船号
if(j==0)
{
room=i;
break;
}
}
if(room>=1&&room<=Enter1->top)
break;
printf("\n没有此船牌号的轮船,请重新输入!");
}
while(Enter1->top>room) //轮船离开
{
Temp1->top++;
Temp1->stack1[Temp1->top]=Enter1->stack1[Enter1->top];//让后面的轮船进入让路区
Enter1->stack1[Enter1->top]=NULL;
Enter1->top--;
}
p=Enter1->stack1[Enter1->top];
Enter1->stack1[Enter1->top]=NULL;
Enter1->top--;
while(Temp1->top>=1)//再把让路区的轮船放到避风港
{
Enter1->top++;
Enter1->stack1[Enter1->top]=Temp1->stack1[Temp1->top];
Temp1->stack1[Temp1->top]=NULL;
Temp1->top--;
}
printf("\n请输入离开的时间/Year:Month:Day/:");
scanf("%d:%d:%d",&(p->leave1.year),&(p->leave1.month),&(p->leave1.day));
printf("\n离开轮船的船牌号为:");
puts(p->num);
printf("\n其到达时间为: %d:%d:%d",p->reach1.year,p->reach1.month,p->reach1.day);
printf("离开时间为: %d:%d:%d",p->leave1.year,p->leave1.month,p->leave1.day);
A1=p->reach1.year;
A2=p->reach1.month;
A3=p->reach1.day;
B1=p->leave1.year;
B2=p->leave1.month;
B3=p->leave1.day;
printf("\n应交费用为: %2.1f元",((B1-A1)*365+(B2-A2)*30+(B3-A3))*PRICE);
free(p);
//判断等待区上是否有轮船及避风港是否已满
if(W1->head1!=W1->rear1&&Enter1->top<MAX) //等待区的轮船进入避风港
{
q=W1->head1->next;
t=q->data;
Enter1->top++;
printf("\n等待区的%s号轮船进入避风港第%d号位置.\n",t->num,Enter1->top);
t->reach1.year=B1;
t->reach1.month=B2;
t->reach1.day=B3;
W1->head1->next=q->next;
if(q==W1->rear1) //等待区为空
W1->rear1=W1->head1;
Enter1->stack1[Enter1->top]=t;
free(q);
}
else
printf("\n避风港的等待区里没有船.\n");
}
else
printf("\n避风港里没有船.\n"); //没有轮船
}
//-----------------------------------------------------------------------------------------
//(3)列表显示轮船信息模块
//列表显示短暂靠港区轮船的信息
void List01(SeqStackCar *S)
{
int n,i;
for(n=0;n<=MAX;n++)
{
if(S->stack[n]!=NULL)
n=MAX+1;
}
if(n==MAX+2)
{
printf("\n短暂靠港区里的轮船信息:");
printf("\n位置\t|\t到达时间\t|\t船牌号\n");
for(i=0;i<=MAX;i++)
{
if(S->stack[i]!=NULL)
{
printf("%d号\t|\t",i+1);
printf("%d点%d分 \t|\t ",S->stack[i]->reach.hour,S->stack[i]->reach.min);
puts(S->stack[i]->num);
}
}
}
if(n==MAX+1)
printf("\n现在短暂靠港区里没有船\n");
}
//-----------------------------------------------------------------------------------------
//列表显示短暂靠港区的等待区里轮船信息
void List02(LinkQueueCar *W)
{
QueueNode *p;
p=W->head->next;
if(W->head!=W->rear) //判断等待区里是否有船
{
printf("\n等待区里轮船的号码为:\n");
while(p!=NULL)
{
puts(p->data->num);
p=p->next;
}
}
else
printf("\n现在短暂靠港区的等待区里没有船.\n");
}
//-----------------------------------------------------------------------------------------
//列表显示避风港里轮船信息
void List11(SeqStackCar1 *S1)
{
int i;
if(S1->top>0) //判断避风港里是否有船
{
printf("\n避风港:");
printf("\n位置\t|\t到达时间\t|\t船牌号\n");
for(i=1;i<=S1->top;i++)
{
printf("%d号\t|\t",i);
printf("%d年%d月%d日 \t|\t ",S1->stack1[i]->reach1.year,S1->stack1[i]->reach1.month,S1->stack1[i]->reach1.day);
puts(S1->stack1[i]->num);
}
}
else
printf("\n现在避风港里没有船\n");
}
//-----------------------------------------------------------------------------------------
//列表显示避风港的等待区里轮船信息
void List22(LinkQueueCar1 *W1)
{
QueueNode1 *p;
p=W1->head1->next;
if(W1->head1!=W1->rear1) //判断等待区里是否有船
{
printf("\n等待区里轮船的号码为:\n");
while(p!=NULL)
{
puts(p->data->num);
p=p->next;
}
}
else
printf("\n现在避风港的等待区里没有船.\n");
}
//-----------------------------------------------------------------------------------------
//显示轮船信息函数
void List(SeqStackCar1 S1,SeqStackCar S,LinkQueueCar1 W1,LinkQueueCar W)
{
int flag,tag;
flag=1;
while(flag)
{
printf("\n请选择地点:");
printf("\n1.避风港\n2.避风港的等待区\n3.短暂靠港区\n4.短暂靠港区的等待区\n5.返回系统菜单\n");
while(1)
{
scanf("%d",&tag);
if(tag>=1&&tag<=5)
break;
else
printf("\n请选择1|2|3|4|5:");
}
switch(tag)
{
case 1:
List11(&S1);
break; //列表显示避风港信息
case 2:
List22(&W1);
break; //列表显示等待区信息
case 3:
List01(&S);
break;
case 4:
List02(&W);
break;
case 5:
flag=0;//返回系统菜单
break;
default:
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -