m0_63999697 2022-03-10 14:15 采纳率: 93.5%
浏览 43
已结题

想先删掉链表里的VIP客户再删掉Ordinary客户该怎么写delete函数?

问题描述
注意:用链表完成
现在银行都有排队叫号系统,如果你到银行去办理业务,首先取得一个顺序号,并告诉你前面有多少人在等待。
现在请你设计、并实现该系统。

客户信息包括:取号的号码、客户银行卡号码、客户类型(包括普通客户和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呢?但是我不知道咋写

  • 写回答

1条回答 默认 最新

  • 一只蚂蝼 2022-03-10 15:39
    关注

    img


    兄弟新加的程序位置应该在输入函数,而不是打印函数啊

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月18日
  • 已采纳回答 3月10日
  • 创建了问题 3月10日

悬赏问题

  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 linux驱动,linux应用,多线程