问题描述
注意:用链表完成
现在银行都有排队叫号系统,如果你到银行去办理业务,首先取得一个顺序号,并告诉你前面有多少人在等待。
现在请你设计、并实现该系统。
客户信息包括:取号的号码、客户银行卡号码、客户类型(包括普通客户和vip客户,分别用Ordinary和VIP表示)。
VIP用户有优先权,即VIP入队时,可以插入到 所有Ordinary类型用户的前面,已经排队的最后一个VIP用户的后面。
本题要求实现以下功能:
(1)客户进入银行并取号,该功能对应的命令为IN number type,number表示客户银行卡号码,type表示客户类型。
(2)在上一题基础上,按取号顺序列出当前未办理业务的客户信息,该功能对应的命令为LIST。
(3)客户办理完业务并离开银行,该功能对应的命令为OUT。
(4)退出系统,该功能对应的命令为QUIT。
输入
输入有多行,每行表示一种操作。
本题实现的操作有:
IN guestnumber guesttype
其中IN 表示入队,guestnumber表示客户银行卡号码,guesttype有两种取值,分别为Ordinary和VIP,表示普通客户与VIP客户。
LIST
按取号的顺序输出队列中所有排队的客户信息。
QUIT
退出银行排队系统
请注意:输入的数据中,只有最后一个命令是QUIT命令。
输出
输出有多行,对不同的命令给出不同的输出。
以下是具体的输出说明:
IN 客户银行卡号码 客户类型
该命令首先在单独的一行中输出"IN:", 然后再输出客户信息。
客户信息包括客户编号 客户银行卡号码 客户类型 该客户前面的客户数。客户编号由系统在客户取号的时候给定,从1开始顺序编号。
客户类型分为Ordinary和VIP。数据之间用一个空格分开。
请注意:
第一个客户入队后,则该用户的顺序号为1,前面有0个客户等待;
第二个客户入队后,则该用户的顺序号为2,前面有1个客户等待。
以此类推。
LIST
该命令首先在单独的一行中输出"LIST:", 后面有若干行先按客户类型(VIP优先),再按客户取号的顺序输出,每一行输出一个客户的信息,每行的输出格式为
客户编号 客户银行卡号码 客户类型
OUT
该命令首先在单独的一行中输出"OUT:",接下来一行输出办理业务的客户信息,包括顺序号,客户银行卡号码和客户类型。
如果没有办理业务的客户,则输出"FAILED:"。
QUIT
在单独的一行中显示"GOOD BYE!"后结束程序。
输入样列
IN 1000001 Ordinary
IN 2000003 VIP
IN 2000009 VIP
OUT
OUT
OUT
OUT
IN 1000007 Ordinary
IN 2000005 VIP
LIST
OUT
QUIT
输出样例
IN:1 1000001 Ordinary 0
IN:2 2000003 VIP 0
IN:3 2000009 VIP 1
OUT:2 2000003 VIP
OUT:3 2000009 VIP
OUT:1 1000001 Ordinary
FAILED:
IN:4 1000007 Ordinary 0
IN:5 2000005 VIP 0
LIST:
5 2000005 VIP
4 1000007 Ordinary
OUT:5 2000005 VIP
GOOD BYE!
#include<bits/stdc++.h>
using namespace std;
typedef struct Client{
int sernumber;
char guestnumber[20];
char guesttype[20];
struct Client *next;
}Client;
int n=0;
int wait1=0,wait2=0;
int out1=0,out2=0;
void inputSingle(Client *s)
{
scanf("%s %s",s->guestnumber,s->guesttype);
}
void outputSingle(Client *s)
{
n+=1;
s->sernumber=n;
if(strcmp(s->guesttype,"VIP")==0){
printf("%d %s %s %d\n",s->sernumber,s->guestnumber,s->guesttype,wait1-out1);
wait1++;
}
if(strcmp(s->guesttype,"Ordinary")==0){
printf("%d %s %s %d\n",s->sernumber,s->guestnumber,s->guesttype,wait2-out1-out2);
wait2++;
}
}
void outputList(Client *L)
{
Client *p;
p=L->next;
while(p!=NULL){
outputSingle(p);
p=p->next;
}
}
void insert(Client *L,Client *s)
{
Client *pre,*p;
pre=L;
p=L->next;
while(p!=NULL){
pre=p;
p=p->next;
}
s->next=pre-next;
pre->next=s;
}
int delete(Client *L,Client *s)
{
Client *pre,*p;
pre=L;
p=L->next;
while(p!=NULL&&strcmp(p->guesttype,"VIP")==0){
pre->next=p->next;
free(p);
out1++;
}
if(p==NULL){
return 0;
}
else{
pre=p;
p=p->next;
}
}
Client* createList()
{
Client *L;
L=(Client *)malloc(sizeof(Client));
L->next=NULL;
return L;
}
int main()
{
Client *s,*L;
string order;
while(1){
cin>>order;
if(order=="IN"){
printf("IN:");
s=(Client *)malloc(sizeof(Client));
inputSingle(s);
outputSingle(s);
}
if(order=="LIST"){
puts("LIST:");
outputList(L);
}
if(order=="OUT"){
}
}
return 0;
}
暂时只写了这些,我想能不能遍历链表两遍,先删掉VIP再删掉Ordinary呢?但是我不知道咋写