#include<string.h>
#include <stdio.h>
#include <stdlib.h>
#include<windows.h> //cls清屏
/* 旅游景点信息管理系统
旅游景点的信息包括:编号、景点名称、景点来源、景点历史、景点图片、地点、所在地区、门票价格、优惠条件等。系统能够完成旅游景点信息的查询、更新、插入、删除、排序等功能。
(1) 排序:按编号对所有旅游景点的信息进行排序。
(2) 查询:分别按编号、景点名称、地点条件查找旅游景点信息。
(3) 更新:按编号对某个旅游景点的某项信息进行修改。
(4) 插入:加入新旅游景点的信息。
(5) 删除:按编号删除已注销的旅游景点的信息。
(6) 浏览:输出所有旅游景点信息。
(7) 统计:统计某地区某地点旅游景点的数量并输出。 */
//链表定义
typedef struct
{
int ID; //编号//
char spot_name[30]; //景点名称//
char spot_source[30]; //景点来源//
char spot_history[100]; //景点历史//
//unsigned char spot prcture;// //景点图片//
char spot[30]; //地点//
char spot_area[30]; //所在地区//
int price; //门票价格//
char discount_situation[50]; //优惠条件//
}datatype;
typedef struct Node
{
datatype data;
struct Node* next; //定义为next的指针//
}Node;
Node list; //链表list//
//函数定义
int Menu(); //主菜单 【通过】
void Close_menu(); //关闭主菜单 【通过】
void Clean_screen(); //清屏 【通过】
int Read_file(Node*lp); //写入文件 【通过】
int Save_file(Node*lp); //保存且关闭文件 【通过】
void Sort(Node*lp); //排序:按编号对所有旅游景点的信息进行排序 【通过】
void Search_menu(Node*lp); //查询菜单: 1.编号 2.景点名称 3.地点条件 【通过】
void Search_ID(Node*lp); //查询1:编号 【通过】
void Search_spot_name(Node*lp); //查询2:景点名称 【通过】
void Search_spot(Node*lp); //查询3:地点条件 【通过】
void Update(Node*lp); //更新:按编号对某个旅游景点的某项信息进行修改 【通过】
void Add_menu(Node*lp); //插入菜单 【通过】
void Add(Node*lp,Node a); //插入:加入新旅游景点的信息 【通过】
void Delete_menu(Node*lp); //删除:按编号删除已注销的旅游景点的信息 【通过】
void Printf(Node*lp); //浏览:输出所有旅游景点信息 【通过】
void Count(Node*lp); //统计:统计某地区某地点旅游景点的数量并输出 【通过】
//主函数
int main() //【通过】
{
//SetConsoleOutputCP(65001);
Read_file(&list);
int go_on=1;
while(1)
{
Menu();
while(1)
{printf("继续使用?1.返回主菜单 2.退出程序\n");
scanf("%d",&go_on);
if(go_on==2)
exit(0);
else if(go_on==1)
break;
else
printf("选择错误,请重新输入\n");}
}
return 0;
}
//子函数
int Menu() //主菜单 【通过】
{
int choice;
Clean_screen();
printf("旅游景点信息管理系统\n");
printf("(1) 排序:按编号对所有旅游景点的信息进行排序。\n");
printf("(2) 查询:分别按编号、景点名称、地点条件查找旅游景点信息。\n");
printf("(3) 更新:按编号对某个旅游景点的某项信息进行修改。\n");
printf("(4) 插入:加入新旅游景点的信息。\n");
printf("(5) 删除:按编号删除已注销的旅游景点的信息。\n");
printf ("(6) 浏览:输出所有旅游景点信息。\n");
printf("(7) 统计:统计某地区某地点旅游景点的数量并输出。\n");
printf("(8) 退出系统\n");
printf("请输入选项:\n");
scanf("%d",&choice);
switch(choice)
{
case 1:
Sort(&list);
break;
case 2:
Search_menu(&list);
break;
case 3:
Update(&list);
break;
case 4:
Add_menu(&list);
break;
case 5:
Delete_menu(&list);
break;
case 6:
Printf(&list);
break;
case 7:
Count(&list);
break;
case 8:
Close_menu();
break;
default:printf("选择错误\n");break;
}
return 1;
}
void Close_menu() //关闭主菜单【通过】
{
exit(0);
}
void Clean_screen() //清屏 【通过】
{
system("cls");
}
int Read_file(Node* lp) //【通过】
{
FILE* fp = fopen("file.txt", "r");
Node st;
Node* s;
Node* t = lp;
if (fp == NULL)
{
return 0;
}
else while (fscanf(fp, "%d %s %s %s %s %s %d\n %s\n",&st.data.ID,st.data.spot_name,st.data.spot_source,st.data.spot_history,st.data.spot,st.data.spot_area,&st.data.price,&st.data.discount_situation) != EOF)
{
s = (Node*)malloc(sizeof(Node));
*s = st;
t->next = s; // 尾插法
t = s;
t->next = NULL;
}
fclose(fp);
return 1;
}
int Save_file(Node*lp) //保存文件【通过】
{
FILE* fpWrite = fopen("file.txt", "w");
if (fpWrite == NULL)
{
return 0;
}
Node* p = lp->next;
while (p != NULL)
{
fprintf(fpWrite,"%d %s %s %s %s %s %d\n %s\n",p->data.ID,p->data.spot_name,p->data.spot_source,p->data.spot_history,p->data.spot,p->data.spot_area,p->data.price,p->data.discount_situation);
p = p->next;
}
fclose(fpWrite);
return 1;
}
void Sort(Node*lp) //排序:按编号对所有旅游景点的信息进行排序 【通过】
{
Clean_screen();
for(Node*p=lp->next;p!=NULL;p=p->next)
{
for(Node*t=p;t!=NULL;t=t->next)
{
if(p->data.ID>t->data.ID)
{ Node change=*p;
*p=*t;
*t=change;
change.next=p->next;
p->next=t->next;
t->next=change.next;}
}
}
Printf(lp);//显示输出结果
Save_file(lp);
}
void Search_menu(Node*lp) //查询菜单: 1.编号 2.景点名称 3.地点条件 【通过】
{
Clean_screen();
int choice=0;
printf("查询菜单:\n");
printf("1.编号查找\n");
printf("2.景点名称查找\n");
printf("3.地点条件查找\n");
scanf("%d",&choice);
switch(choice)
{
case 1:Search_ID(lp);break;
case 2:Search_spot_name(lp);break;
case 3:Search_spot(lp);break;
default:printf("选择错误");break;
}
}
void Search_ID(Node*lp) //查询1:编号 【通过】
{
printf("输入编号:");
int id;
int flag=0;
scanf("%d",&id);
Node*ser_ID=lp->next;
while(ser_ID!=NULL)
{
if(ser_ID->data.ID==id)
{
printf("编号 景点名称 景点来源 景点历史 地点 所在地区 门票价格\n 优惠条件\n");
printf("%d %s %s %s %s %s %d\n %s\n",ser_ID->data.ID,ser_ID->data.spot_name,ser_ID->data.spot_source,ser_ID->data.spot_history,ser_ID->data.spot,ser_ID->data.spot_area,ser_ID->data.price,ser_ID->data.discount_situation);
flag=1;
}
ser_ID=ser_ID->next;
}
if(flag==0)
printf("无法找到\n");
}
void Search_spot_name(Node*lp) //查询2:景点名称 【通过】
{
printf("输入景点名称:");
int flag=0;
char name[30];
scanf("%s",&name);
Node*ser_sp_n=lp;
while(ser_sp_n!=NULL)
{
if(strcmp(name,ser_sp_n->data.spot_name)==0)
{
printf("编号 景点名称 景点来源 景点历史 地点 所在地区 门票价格\n 优惠条件\n");
printf("%d %s %s %s %s %s %d\n %s\n",ser_sp_n->data.ID,ser_sp_n->data.spot_name,ser_sp_n->data.spot_source,ser_sp_n->data.spot_history,ser_sp_n->data.spot,ser_sp_n->data.spot_area,ser_sp_n->data.price,ser_sp_n->data.discount_situation);
flag=1;
}
ser_sp_n=ser_sp_n->next;
}
if(flag==0)
printf("无法找到\n");
}
void Search_spot(Node*lp) //查询3:地点条件 【通过】
{
printf("输入地点条件:");
int flag=0;
char spot[30];
scanf("%s",&spot);
Node*ser_sp_s=lp;
while(ser_sp_s!=NULL)
{
if(strcmp(spot,ser_sp_s->data.spot)==0)
{
printf("编号 景点名称 景点来源 景点历史 地点 所在地区 门票价格\n 优惠条件\n");
printf("%d %s %s %s %s %s %d\n %s\n",ser_sp_s->data.ID,ser_sp_s->data.spot_name,ser_sp_s->data.spot_source,ser_sp_s->data.spot_history,ser_sp_s->data.spot,ser_sp_s->data.spot_area,ser_sp_s->data.price,ser_sp_s->data.discount_situation);
flag=1;
}
ser_sp_s=ser_sp_s->next;
}
if(flag==0)
printf("无法找到\n");
}
void Update(Node*lp) //更新:按编号对某个旅游景点的某项信息进行修改 【通过】
{
Clean_screen();
printf("输入编号:");
int id;
int flag=0;
scanf("%d",&id);
Node*ser_ID=lp;
while(ser_ID!=NULL)
{
if(ser_ID->data.ID==id)
{
printf("编号 景点名称 景点来源 景点历史 地点 所在地区 门票价格\n 优惠条件\n");
printf("%d %s %s %s %s %s %d\n %s\n\n",ser_ID->data.ID,ser_ID->data.spot_name,ser_ID->data.spot_source,ser_ID->data.spot_history,ser_ID->data.spot,ser_ID->data.spot_area,ser_ID->data.price,ser_ID->data.discount_situation);
flag=1;
break;
}
ser_ID=ser_ID->next;
}
if(flag==0)
{printf("无法找到\n");
}
if(flag==1){
int choice=0;
printf("1.景点名称\n");
printf("2.景点来源\n");
printf("3.景点历史\n");
printf("4.地点\n");
printf("5.所在地区\n");
printf("6.门票价格\n");
printf("7.优惠条件\n");
printf("请选择:\n");
getchar();
scanf("%d",&choice);
switch(choice)
{
case 1:
printf("输入景点名称\n");
scanf("%s",ser_ID->data.spot_name);
Printf(lp);
break;
case 2:
printf("输入景点来源\n");
scanf("%s",ser_ID->data.spot_source);
Printf(lp);
break;
case 3:
printf("输入景点历史\n");
scanf("%s",ser_ID->data.spot_history);
Printf(lp);
break;
case 4:
printf("输入地点\n");
scanf("%s",ser_ID->data.spot);
Printf(lp);
break;
case 5:
printf("输入所在地区\n");
scanf("%s",ser_ID->data.spot_area);
Printf(lp);
break;
case 6:
printf("输入门票价格\n");
scanf("%d",&ser_ID->data.price);
Printf(lp);
break;
case 7:
printf("输入优惠条件\n");
getchar();
scanf("%s",&ser_ID->data.discount_situation);
Printf(lp);
break;
default: printf("选择错误\n");break;
}}
Save_file(lp);
}
void Add_menu(Node*lp) //插入菜单【通过】
{
Clean_screen();
Node Ad_m;
printf("请输入:\n");
int id;
int flag=0;
scanf("%d",&id);
Node*ser_ID=lp;
while(ser_ID!=NULL)
{
if(ser_ID->data.ID==id)
{
flag=1;
break;
}
ser_ID=ser_ID->next;
}
if(flag==1)
{printf("编号重复\n");
}
if(flag==0)
{
printf("编号 景点名称 景点来源 景点历史 地点 所在地区 门票价格\n 优惠条件\n");
scanf("%d %s %s %s %s %s %d %s",&Ad_m.data.ID,Ad_m.data.spot_name,Ad_m.data.spot_source,Ad_m.data.spot_history,Ad_m.data.spot,Ad_m.data.spot_area,&Ad_m.data.price,&Ad_m.data.discount_situation);
Add(&list,Ad_m);
Printf(lp);//显示输出结果
}
}
void Add(Node*lp,Node a) //插入:加入新旅游景点的信息 【通过】
{
Node*p=(Node*)malloc(sizeof(Node)); //头插法(可以考虑尾插法)
Node*s=lp;
*p=a;
p->next=s->next;
s->next=p;
Save_file(lp);
}
/*void Delete_menu(Node*lp) //删除 1【通过】
{
Clean_screen();
printf("输入编号:");
int id;
int flag=0;
scanf("%d",&id);
Node*ser_ID=lp;
while(ser_ID!=NULL)
{
if(ser_ID->data.ID==id)
{
//printf("编号 景点名称 景点来源 景点历史 地点 所在地区 门票价格 优惠条件\n");
printf("%d %s %s %s %s %s %f %f",ser_ID->data.ID,ser_ID->data.spot_name,ser_ID->data.spot_source,ser_ID->data.spot_history,ser_ID->data.spot,ser_ID->data.spot_area,ser_ID->data.price,ser_ID->data.discount_situation);
flag=1;
break;
}
ser_ID=ser_ID->next;
}
if(flag==0)
{printf("无法找到\n");
}
if(flag==1)
{Node*r=NULL;
r=ser_ID->next;
ser_ID->data=r->data;
ser_ID->next=r->next;
free(r);
Printf(lp);//显示输出结果
Save_file(lp);}
}
*/
void Delete_menu(Node*lp) //删除2 【通过】
{
Clean_screen();
printf("输入编号:");
int id;
int flag=0;
scanf("%d",&id);
Node*ser_ID=lp;
while(ser_ID!=NULL)
{
if(ser_ID->data.ID==id)
{
flag=1;
break;
}
ser_ID=ser_ID->next;
}
if(flag==0)
{
printf("无法找到\n");
}
if(flag==1)
{
Node*r=NULL;
r=ser_ID->next;
if(r==NULL) // 如果要删除的节点是最后一个节点
{
Node*p=lp;
while(p->next!=ser_ID)
{
p=p->next;
}
p->next=NULL;
}
else
{
ser_ID->data=r->data;
ser_ID->next=r->next;
free(r);
}
Printf(lp);//显示输出结果
Save_file(lp);
}
}
void Printf(Node*lp) //浏览:输出所有旅游景点信息 【通过】
{
Clean_screen();
Node*p=lp->next;
printf("编号 景点名称 景点来源 景点历史 地点 所在地区 门票价格\n 优惠条件\n");
while(p!=NULL)
{
printf("%d %s %s %s %s %s %d\n %s\n",p->data.ID,p->data.spot_name,p->data.spot_source,p->data.spot_history,p->data.spot,p->data.spot_area,p->data.price,p->data.discount_situation);
p=p->next;
}
}
void Count(Node*lp) //统计:统计某地区某地点旅游景点的数量并输出 【通过】
{
Clean_screen();
int num=0;
int num_1=0;
int num_2=0;
int flag_1=0;
printf("输入地点条件:\n");
char spot[30];
scanf("%s",&spot);
Node*ser_sp_s=lp;
while(ser_sp_s!=NULL)
{
if(strcmp(spot,ser_sp_s->data.spot)==0)
{
num_1=num_1+1;
flag_1=1;
}
ser_sp_s=ser_sp_s->next;
}
int flag_2=0;
printf("输入地区条件:\n");
char spot_area[30];
scanf("%s",&spot_area);
Node*ser_sp_s_a=lp;
while(ser_sp_s_a!=NULL)
{
if(strcmp(spot_area,ser_sp_s_a->data.spot_area)==0)
{
num_2=num_2+1;
flag_2=1;
}
ser_sp_s_a=ser_sp_s_a->next;
}
if(flag_1==0 && flag_2==0)
printf("无法找到\n");
else
{ num=num_1+num_2;
printf("数量为:%d\n",num);
}
}