小旭追女神之小旭要给女神抢票
Time Limit: 1000 ms Memory Limit: 65536 KiB
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