#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define SIZE 11 //这里指娱乐项目的个数
//#define size 2 //初步将游客定为1个
typedef int Status;
typedef int ElemType;
int size;
struct Item_type
{
int number;//序号
char name[50];//名称
int timeHour;//时间的时针
int timeMinute;//时间的秒针
int population;//人数
char introdution[1000];//娱乐设备的简介
float price;//游玩一次的价格
}item[SIZE];
typedef struct Item_typeList
{
struct Item_type data;
struct Item_typeList *next;
}itemNode,*LinkList;
struct People/*游客基本信息(包括姓名和年龄)*/
{
char name[50];//姓名
int age; //年龄
int num;//预订的游乐项目的序号
};//people[SIZE];
typedef struct PeopleList
{
struct People data;
struct PeopleList *next;
}peopleNode,*LinkList_1;
//创建一个有n个元素的链表,头插法
LinkList CreateList_device(LinkList L,int n)//建立游乐场设备基本信息
{
int i;
FILE *fp;
if((fp=fopen("D:\\ITEM\\item.dat","rb")) ==NULL)
{
printf("cannot open file\n");
exit(0);
}
itemNode *p;
L=(itemNode*)malloc(sizeof(itemNode));
L -> next=NULL;
for(i=0;i<n;i++)
{
p=(itemNode* )malloc(sizeof(itemNode));
fread(&item[i],sizeof(struct Item_type ),1,fp);
p->data.number=item[i].number;
strcpy(p->data.name,item[i].name);//字符串以strcpy复制
p->data.timeHour=item[i].timeHour;
p->data.timeMinute=item[i].timeMinute;
p->data.population=item[i].population;
strcpy(p->data.introdution,item[i].introdution);//字符串以strcpy复制
p->data.price=item[i].price;
p->next=L->next;
L->next=p;
}
return L;
}
struct People input_oneRecord()
{
struct People a;
printf("请输入姓名:\n");
scanf("%s",a.name);
getchar();
printf("输入年龄和娱乐设备序号\n");
scanf("%d %d",&a.age,&a.num);
getchar();
return a;
}
LinkList_1 CreateList_visitor(LinkList_1 L,int n)//输入游客信息 (购票时使用)
{
int i;
peopleNode *p;
L=(peopleNode*)malloc(sizeof(peopleNode));
L->next=NULL;
for(i=0;i<n;i++)
{
p=(peopleNode*)malloc(sizeof(peopleNode));
p->data=input_oneRecord();
p->next=L->next;
L->next=p;
}
return L;
}
Status traverList_People(LinkList_1 L)
{
peopleNode *p;
p=L->next;
while(p)//遍历单链表
{
printf("姓名:%s \t年龄:%d\n",p->data.name,p->data.age);
p=p->next;
}
return OK;
}
//输出数据域中的数据 1
void outputData_1(struct Item_type data)
{
printf("------------------------------------------------------------\n");
printf("娱乐项目序号:%d\t| 娱乐项目名称:%s\t|开放时间:%.2d:%.2d \t|人数:%d\n简介: %s\t|费用:%.2f\n\n",data.number,data.name,data.timeHour,data.timeMinute,data.population,data.introdution,data.price);
}
Status traverList_1(LinkList L)// 和outputData函数输出当日的游玩情况||
{
itemNode *p;
p=L->next;
while(p)//遍历单链表
{
outputData_1(p->data);
p=p->next;
}
return OK;
}
//输出数据域中的数据 2
void outputData_2(struct Item_type data,int n)
{
printf(" 第%d名\n娱乐项目序号:%d \t娱乐项目名称:%s\n",n,data.number,data.name);
}
Status traverList_2(LinkList L)//热度排名输出
{
itemNode *p;
p=L->next;
int n=SIZE;
while(p)//遍历单链表
{
outputData_2(p->data,n);
p=p->next;
n--;
}
return OK;
}
void outputData_3(struct Item_type data)//客供选择的函数
{
printf(" 娱乐项目序号:%d \t娱乐项目名称:%s\n",data.number,data.name);
}
Status traverList_3(LinkList L)
{
itemNode *p;
p=L->next;
while(p)//遍历单链表
{
outputData_3(p->data);
p=p->next;
}
return OK;
}
//销毁一个链表
Status DestroyList(LinkList L)
{
itemNode *p;
while (p)
{
p=L;
L=L->next;
free(p);
}
return OK;
}
void Home()//主界面
{
printf("欢迎━(*`?′*)ノ亻!来到游乐场查询系统\n");
printf("\t\t 欢迎使用游乐场查询系统 \n");
printf("\t\t --------------------------------------------\n");
printf("\t\t| |\n");
printf("\t\t| O(∩_∩)O~~ |\n");
printf("\t\t| |\n");
printf("\t\t| 1.游乐场管理员界面. |\n");
printf("\t\t| 2.游客界面. |\n");
printf("\t\t| 3.退出 |\n");
printf("\t\t| |\n");
printf("\t\t| |\n");
printf("\t\t| |\n");
printf("\t\t --------------------------------------------\n");
printf("\n\t\t 请输入您要进行的操作的序号 \n");
}
void Home1()//界面1
{
printf("\t\t --------------------------------------------\n");
printf("\t\t| |\n");
printf("\t\t| O(∩_∩)O~~ |\n");
printf("\t\t| 1.查询当日各设施的游玩情况 |\n");
printf("\t\t| 2.查询某一设施的营销总额 |\n");
printf("\t\t| 3.退出 |\n");
printf("\t\t| |\n");
printf("\t\t| |\n");
printf("\t\t| |\n");
printf("\t\t --------------------------------------------\n");
printf("\n\t\t 请输入您要进行的操作的序号 \n");
}
void Home2()//界面2
{
printf("\t\t --------------------------------------------\n");
printf("\t\t| |\n");
printf("\t\t| O(∩_∩)O~~ |\n");
printf("\t\t| 1.查询最早开放的娱乐设备 |\n");
printf("\t\t| 2.查询最晚开放的娱乐设备 |\n");
printf("\t\t| 3.查询娱乐热度 |\n");
printf("\t\t| 4.预订或者购票 |\n");
printf("\t\t| 5.退出 |\n");
printf("\t\t --------------------------------------------\n");
printf("\n\t\t 请输入您要进行的操作的序号 \n");
}
void ffscanf_information()//配合input实现向文件输入娱乐设备的基本信息
{
FILE *fp;
int i;
if((fp=fopen("D:\\ITEM\\item.dat","wb")) ==NULL)
{
printf("cannot open file\n");
return;
}
for(i=0;i<SIZE;i++)
{
if(fwrite(&item[i],sizeof(struct Item_type),1,fp)!=1)
printf("file write error\n");
}
fclose(fp);//注意fclose的位置
}
int inputFile()//输入数据到文本中
{
int i;
for(i=0;i<SIZE;i++)
{
scanf("%d %s %d %d %d %s %f",&item[i].number,item[i].name,&item[i].timeHour,&item[i].timeMinute,&item[i].population,item[i].introdution,&item[i].price);//往文件里面输入数据
}
ffscanf_information();
}
int ffprint_information()//从文件中读取数据以展示原本数据
{
int i;
FILE *fp;
if((fp=fopen("D:\\ITEM\\item.dat","rb")) ==NULL)
{
printf("cannot open file\n");
exit(0);
}
for(i=0;i<SIZE;i++)
{
fread(&item[i],sizeof(struct Item_type ),1,fp);
printf("娱乐项目序号:%d\n 娱乐项目名称:%s\n开放时间:%.2d:%.2d \n人数:%d\n简介: %s\n费用:%.2f\n\n",item[i].number,item[i].name,item[i].timeHour,item[i].timeMinute,item[i].population,item[i].introdution,item[i].price);
}
fclose(fp);
return 0;
}
itemNode *findItem(LinkList L)//查找设备所在的位置,并返回地址(营业额查找函数)
{
ElemType x;
printf("请输入你要查找的娱乐项目的序号:");
scanf("%d",&x);
LinkList p;
p=L->next;
while(p&&p->data.number!=x)
p=p->next;
return p;
}
itemNode *findItem_22(LinkList L,int x)//查找设备所在的位置,并返回地址(营业额查找函数)
{
LinkList p;
p=L->next;
while(p&&p->data.number!=x)
p=p->next;
return p;
}
void inputSale(LinkList L)//根据findItem函数返回的地址进行输出数据
{
LinkList q;
q=findItem(L);
float a,b;
a=q->data.population;
b=q->data.price;
printf("该项目是%s\t今日营业额为%.2f元。",q->data.name,a*b);
}
itemNode *findFirst(LinkList L)//查找设备所在的位置,并返回地址(查找最早开放的设备)
{
ElemType min_1,min_2;
LinkList p,q,r;
p=L->next;
min_1=p->data.timeHour;
min_2=p->data.timeMinute;
p=L->next;
while(p)
{
if(min_1<p->data.timeHour)
{
q=p;
}
else
{
if(min_2<p->data.timeMinute)
{
q=p;
}
else
{
r=p;
}
}
p=p->next;
}
q=r;
return q;
}
void inputFirst(LinkList L)//根据findFirst函数返回的地址进行输出数据
{
LinkList q;
q=findFirst(L);
printf("最早开放项目是%s\t开放时间在%.2d:%.2d\n",q->data.name,q->data.timeHour,q->data.timeMinute);
}
itemNode *findLast(LinkList L)//查找设备所在的位置,并返回地址(查找最晚开放的设备)
{
ElemType max_1,max_2;
LinkList p,q,s;
p=L->next;
q=p;
max_1=p->data.timeHour;
max_2=p->data.timeMinute;
p=L->next;
while(p)
{
if(max_1<p->data.timeHour)
{
q=p;
max_1=p->data.timeHour;//把大的时针给max_1
}
else if(max_1==p->data.timeHour)
{
if(max_2<p->data.timeMinute)
{
q=p;
max_2=p->data.timeMinute;//大的分针给max_2
}
}
p=p->next;
}
return q;
}
void inputLast(LinkList L)//根据findFirst函数返回的地址进行输出数据
{
LinkList q;
q=findLast(L);
printf("最晚开放项目是%s\t开放时间在%.2d:%.2d\n",q->data.name,q->data.timeHour,q->data.timeMinute);
}
/*void swap(itemNode *a,itemNode *b)
{
int temp;
char str[50];
temp=a->data.number;
a->data.number=b->data.number;
b->data.number=temp;
strcpy(str,a->data.name);
strcpy(a->data.name,b->data.name);
strcpy(b->data.name,str);
}
void ListSort(LinkList L)//冒泡排序
{
itemNode *p,*a,*b,*q;
int n,i,j;
n=SIZE;
q=L;
for(j=1;j<n;j++)
{
p=q->next;
for(i=0;i<n-i;i++)
{
if(p->data.population>p->next->data.population)
swap(p,p->next);
p=p->next;
}
}
}*/
void BubbleSort(LinkList L)
{
itemNode *p;
p=L;
if(p->next==NULL||p->next->next==NULL)
return ;
itemNode *cur;// 游标节点
itemNode *pre;//游标结点的前驱结点
itemNode *tail=NULL;//尾指针结点
itemNode *temp;//临时结点
while(p->next!=tail)
{ //当头节点的下一个 节点为尾节点是跳出循环因为当前链表为排序的元素只剩下一个时候无需排序
cur=p->next;
pre=p;
while(cur->next != tail )
{
if(cur->data.population > cur->next->data.population)
{
temp=cur->next; //首先将临时指针指向需要交换位置的节点防止断链
cur->next=temp->next; //节点位置交换
temp->next=cur; //节点位置交换
pre->next=temp; //节点位置交换
pre=temp;
//调整前驱节点的位置 使pre为cur的前驱节点
}
else
{
pre=pre->next;
cur=cur->next;
}
}
tail=cur; //尾节点 指向每一次冒泡出来的最大节点;
}
}
void Purchase_tickets(LinkList_1 L_1)
{
printf("欢迎购票和预订,请输入有效姓名和真实年龄进行下一步。(姓名 年龄 项目序号)\n");
}
void print_str()
{
printf("是否返回上一级\n");
printf("1.确认返回上一级 2.退出\n");
}
void FindPurchase_calculate(LinkList_1 L,LinkList R)
{
int arr[100]={0};
peopleNode *p;
p=L->next;
while(p)//遍历单链表
{
arr[p->data.num]++;
p=p->next;
}
int i;
int s=0;
itemNode *q;
for(i=0;i<100;i++)
{
if(arr[i]>0)
q=findItem_22(R,i);
s+=q->data.price*arr[i];
}
printf("您需要付款%d元。\n",s);
}
void print_Home1()//界面1功能展示
{
int ABC;
int b;
LinkList L,R;
L=CreateList_device(L,SIZE);
Home1();
scanf("%d",&b);
if(b==1)
{
traverList_1(L);
print_str();
scanf("%d",&ABC);
if(ABC==1)
print_Home1();
else
exit(0);
}
else if(b==2)
{
traverList_3(L);
inputSale(L);
print_str();
scanf("%d",&ABC);
if(ABC==1)
print_Home1();
else
exit(0);
}
else if(b==3)
exit(0);
DestroyList(L);
}
void print_Home2()// 界面2功能展示
{
int ABC;
int c;
LinkList L,R;
L=CreateList_device(L,SIZE);
R=CreateList_device(L,SIZE);
Home2();
scanf("%d",&c);
if(c==1)
{
inputFirst(L);
print_str();
scanf("%d",&ABC);
if(ABC==1)
print_Home2();
else
exit(0);
}
else if(c==2)
{
inputLast(L);
print_str();
scanf("%d",&ABC);
if(ABC==1)
print_Home2();
else
exit(0);
}
else if(c==3)
{
BubbleSort(R);//热度排序(冒泡排序)
traverList_2(R);
print_str();
scanf("%d",&ABC);
if(ABC==1)
print_Home2();
else
exit(0);
}
else if(c==4)
{
LinkList_1 L_1;
traverList_3(L);
int arr[100];
printf("请问你要购几人票\n");
scanf("%d",&size);
Purchase_tickets(L_1);
L_1=CreateList_visitor(L_1,size);
traverList_People(L_1);
FindPurchase_calculate(L_1,L);
print_str();
scanf("%d",&ABC);
if(ABC==1)
print_Home2();
else
exit(0);
}
else
exit(0);
DestroyList(L);
DestroyList(R);
}
int main()
{
int a,b,c,d;
Home();
scanf("%d",&a);
if(a==1)
{
print_Home1();
}
else if(a==2)
{
print_Home2();
}
else
exit(0);
return 0;
}
查询系统
1