小旭追女神之小旭要给女神抢票(结构体 链表 函数分治) SDUT OJ3405

18 篇文章 3 订阅
13 篇文章 0 订阅

小旭追女神之小旭要给女神抢票

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

小旭虽然在追女神,但是也没忘了敲代码,这一天,小旭正在敲链表,突然电脑就蓝屏了,无奈之下,小旭重启了电脑,再次登录系统后,发现桌面上多了一个名字叫“抢票神器”的程序,小旭试着运行了一下,果然是抢票用的,于是,小旭决定给自己的女神抢票,由于小旭的抢票神器的成功率实在是高,所以小旭的女神请求小旭给她的好姐妹儿也抢票,小旭怎么说也不能拒绝啊,这可是表现的大好机会,但是,他女神的好姐妹儿太多了,小旭录入她们的信息很费劲,也很费时间,最主要的是小旭没有时间陪她的女神了。但是小旭是程序员啊,于是他想用C语言开发了一套信息录入系统,把申请人的信息排成一个队列,因为小旭要去陪女神,所以他找到了你,请你帮忙。
小旭能告诉你的是:
1.本系统只允许一个身份证号只能买一张票
2.小旭也不知道他的女神有多少好姐妹儿
3.处理到文件结束
4.题目中所有的输出都不加引号(见下面示例)
5.每个人只能申请一张票,每个人用身份证号来标识,因为名字有可能重复
6.下面是小旭设置的该系统应有的指令,指令格式一行字符串,指令和参数空格隔开,这一行字符串的第一个单词永远代表指令
addInfo name sex id aim tel
addInfo表示有小旭的女神的好姐妹儿向小旭申请抢票,接下来的单词就是他们个身份证信息,name表示姓名(不超过20个字符),sex表示性别(只有0和1两个数,0代表男,1代表女),id代表身份证号,固定11位数字,aim表示目的地(长度不超过20位),tel代表电话(长度不超过11位)。如果某个人的信息已经在购买队列中或者已经购买成功,输出”don't buy again“,如果不在,把信息加到队列中,并输出“save succeed”。
delInfo id
delInfo 代表某个小旭的女神的好姐妹儿不想买票了,申请撤销买票,id代表他们的身份证号。如果该同学已经购买成功,输出”you can't revocat“,如果id在购买队列中,将其在购买队列中删除并输出”delete succeed“,如果不在购买队列中也没有购买成功,输出”can't find the id“。id代表刚才命令中的id。
chgInfo id name sex aim tel
chgInfo代表某个小旭的女神的好姐妹儿想要修改她的信息,id代表被修改的人的身份证号(在小旭的的信息录入系统中,某个人的身份证号是不会重复的),随后是这个人的新信息姓名,性别,目的地,电话。如果id在购买队列中,更新队列中的信息,并输出”update succeed“,如果不在购买队列中,输出”can't find the id“。id代表刚才命令中的id。
findInfo id
findInfo代表在购买队列中查找某个人的信息(只在购买队列中查找),id代表身份证号。如果在找到id,输出该id所代表的人的信息,如果找不到,则输出”can't find the id“。id代表命令中的id。
succeedBuy id

succeedBuy id 这是系统发出的命令,代表身份证为id的这个人的票已经购买成功。购买队列中删除这个人的信息,并输出”id succeed to buy“,此条命令执行时保证id一定存在于购买队列中,id代表命令中的id。
你能帮小旭设计出这个系统吗?
PS:如果你还有不懂的地方,就看看示例吧。小旭的幸福就交到你手里了。

Input

题目描述中

Output

题目描述中

Sample Input

addInfo libiao 0 37012411111 Qingdao 17865920000
addInfo libiao 0 37012422222 Jinan 18753377777
addInfo BLF2 0 01000128743 Beijing 17865924965
findInfo 01000128743
succeedBuy 37012411111
addInfo libiao 0 37012411111 Qingdao 17865920000
delInfo 37012411111

Sample Output

save succeed
save succeed
save succeed
BLF2 0 01000128743 Beijing 17865924965
37012411111 succeed to buy
don't buy again
you can't revocat

 

此程序的大体代码如下:

仍有问题,还未改正完全,无法过样例。 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node
{
    char name[25], id[11], aim[25], tel[15];
    int sex;
    struct node *next;
};
struct node * buy_list();
struct node * finish_buy();
void add_Info(struct node *, struct node *);
void del_Info(struct node *, struct node *);
void chg_Info(struct node *, struct node *);
void find_Info(struct node *, struct node *);
void succeedBuy(struct node *, struct node *);
int search(struct node *, struct node *, struct node *);
char order[30];
int main()
{///main函数
    struct node *head1, *head2;
    head1 = buy_list();
    head2 = finish_buy();
    while(~scanf("%s", order))
    {
        if(strcmp(order, "addInfo") == 0)
            add_Info(head1, head2);
        else if(strcmp(order, "delInfo") == 0)
            del_Info(head1, head2);
        else if(strcmp(order, "chgInfo") == 0)
            chg_Info(head1, head2);
        else if(strcmp(order, "findInfo") == 0)
            find_Info(head1, head2);
        else if(strcmp(order, "succeedBuy") == 0)
            succeedBuy(head1, head2);
    }
    return 0;
}
struct node * buy_list()
{///创建购买队列链表
    struct node *head1;
    head1 = (struct node *)malloc(sizeof(struct node));
    head1->next = NULL;
    return head1;
};
struct node * finish_buy()
{///创建购买成功队列链表
    struct node *head2;
    head2 = (struct node *)malloc(sizeof(struct node));
    head2->next = NULL;
    return head2;
};
void add_Info(struct node *head1, struct node *head2)
{///增加信息函数
    struct node *p, *tail;
    int flag = -1;///设置flag记录 search 函数的返回值,减少函数的调用次数
    p = (struct node *)malloc(sizeof(struct node));
    p->next = NULL;
    scanf("%s", p->name);
    scanf("%d", &p->sex);
    scanf("%s", p->id);
    scanf("%s", p->aim);
    scanf("%s", p->tel);
    flag = search(head1, head2, p);
    if(flag == 0)
    {
        tail = head1;
        while(tail->next)  tail = tail->next;
        tail->next = p;
        printf("save succeed\n");
    }
    else if(flag == 1 || flag == 2)
    {
        printf("don't buy again\n");
    }
}
void del_Info(struct node *head1, struct node *head2)
{///删除信息函数
    struct node *p, *tail, *q;
    int flag = -1;
    p = (struct node *)malloc(sizeof(struct node));
    p->next = NULL;
    scanf("%s", p->id);
    flag = search(head1, head2, p);
    if(flag == 2)  printf("you can't revocat\n");
    else if(flag == 1)
    {///先删除购买链表中的信息,再输出 delete succeed
        q = head1;
        tail = q->next;
        while(q->next)
        {
            if(strcmp(tail->id, p->id) == 0)
            {
                q->next = tail->next;
                free(tail);
                break;
            }
        }
        printf("delete succeed\n");
    }
    else if(flag == 0)  printf("can't find the %s\n", p->id);
}
void chg_Info(struct node *head1, struct node *head2)
{///改变信息函数
    struct node *p, *tail, *q;
    p = (struct node *)malloc(sizeof(struct node));
    p->next = NULL;
    scanf("%s", p->id);
    scanf("%s", p->name);
    scanf("%d", &p->sex);
    scanf("%s", p->aim);
    scanf("%s", p->tel);
    if(search(head1, head2, p) == 1)
    {///更新队列中的信息,并输出 update succeed
        q = head1;
        tail = q->next;
        while(tail->next)
        {
            if(strcmp(tail->id, p->id) == 0)
                {
                    p->next = tail->next;
                    q->next = p;
                    free(tail);
                    break;
                }
                q = q->next;
                tail = tail->next;
        }
        printf("update succeed\n");
    }
    else if(search(head1, head2, p) == 0 || search(head1, head2, p) == 2)
    {
        printf("can't find the %s\n", p->id);
    }
}
void find_Info(struct node *head1, struct node *head2)
{///查找信息函数
    struct node *p, *tail;
    int flag = -1;
    p = (struct node *)malloc(sizeof(struct node));
    p->next = NULL;
    scanf("%s", p->id);
    flag = search(head1, head2, p);
    if(flag == 0)  printf("can't find the %s\n", p->id);
    else if(flag == 1)
    {
        tail = head1;
        while(tail->next)
        {
            if(strcmp(tail->id, p->id) == 0)
            {
                printf("%s %d %s %s %s", tail->name, tail->sex, tail->id, tail->aim, tail->tel);
                break;
            }
            tail = tail->next;
        }
    }
    else if(flag == 2)
    {
        tail = head2;
        while(tail->next)
        {
            if(strcmp(tail->id, p->id) == 0)
            {
                printf("%s %d %s %s %s", tail->name, tail->sex, tail->id, tail->aim, tail->tel);
                break;
            }
            tail = tail->next;
        }
    }
}
void succeedBuy(struct node *head1, struct node *head2)
{///将输入的 id 所在的结点从购买队列中删除并加入购买成功队列
    struct node *p, *tail, *q;
    p = (struct node *)malloc(sizeof(struct node));
    p->next = NULL;
    scanf("%s", p->id);
    q = head1;
    tail = q->next;
    while(tail)
    {///将 所需结点从购买队列中抽出
        if(strcmp(tail->id, p->id) == 0)
        {
            q->next = tail->next;
            tail->next = NULL;
            break;
        }
        q = q->next;
        tail = tail->next;
    }
    q = tail;///令 q 指向所需结点,以便改变 tail
    tail = head2;///令 tail 指向 购买成功队列头结点
    while(tail->next)  tail = tail->next;
    tail->next = p;///将所需结点连接到购买成功队列尾
    printf("%s succeed to buy\n", p->id);
}
int search(struct node *head1, struct node *head2, struct node *p)
{///搜索 id 是否在两个链表中,并返回相应数据
    struct node *tail;
    int flag = -1;
    tail = head1->next;
    while(tail->next)
    {
        if(strcmp(tail->id, p->id) == 0)
        {
            flag = 1;
            break;
        }
        tail = tail->next;
    }
    if(flag == -1)
    {
        tail = head2->next;
        while(tail->next)
        {
            if(strcmp(tail->id, p->id) == 0)
            {
                flag = 2;
                break;
            }
            tail = tail->next;
        }
        if(flag == -1)  flag = 0;
    }
    return flag;
}

此代码改正到此程度目前耗时:3 hour

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值