共九个,inputoption inputyn inputelement insert removeal create load mainmenu mainmenu-1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char InputOption(char L, char R); //输入选项,获取一个在给定L、R之间的字符
char InputYN(char *warning); //输出给定提示,要求输入Y或N
void InputElement(struct Signal *p,int opt); //用于修改指定信号机的某一项信息 opt为5时输入所有信息
void insert(struct Signal *, struct Signal *); //在相邻信号机间插入一台新信号机
void removeone(struct Signal *); //删除一条指定的信号机数据
void removeall(); //删除所有信号机数据
struct Signal *Query_name_Accurate(char *); //根据准确的信号机名称查找信号机信息
void Query_name_Fuzzy(char *); //查找所有名称中包含关键词的信号机 输出所有结果
void showone(struct Signal *p); //输出一台信号机的信息
void showall(); //输出所有信号机的信息
void MainMenu();
void removeall();
int amount; //记录信号机数量
struct Signal *Head; //链表头指针
int main(void)
{
MainMenu(); //主菜单
return 0;
}
struct Signal
{
char Name[10]; //信号机名称
int KB; //开放表示 0不开放 1开放
float Pos; //位置根据平面图位置拟定
int Type; //信号机性质,列车信号机取1,调车信号机取0
struct Signal *next,*front; //后一架信号机指针,前一架信号机指针
};
void create(); //创建链表 人工录入信号机信息
void load(); //创建链表 从文件导入信号机信息
void save(); //导出信号机数据
char InputOption(char L, char R)
{
char temp[8]; //存储未判断合法性的输入数据
do
{
printf("\n输入选项编号进行选择:");
scanf("%7s",temp);
while(getchar()!= '\n');
}while(temp[1]!='\0' || !(temp[0]>=L && temp[0]<=R) ); //只允许输入一个字符(\n不计),输入字符必须在给定的L与R之间
return temp[0];
} //用于获取用户输入的编号
char InputYN(char *warning)
{
char temp[8]; //存储未判断合法性的输入数据
do
{
printf("%s(Y/N)",warning); //提示内容通过参数传入
scanf("%7s",temp);
while(getchar()!= '\n');
}while(temp[1]!='\0' || !(temp[0]=='Y'||temp[0]=='N')); //只允许输入一个字符(\n不计),输入字符必须为Y或N
return temp[0];
} //输出给定提示 获取'Y'和'N'
void InputElement(struct Signal *p,int opt)
{
char temp[8]; //存储未判断合法性的输入数据
switch(opt)
{
case 1:
printf("输入信号机名称:");
scanf("%9s",p->Name);
while(getchar()!= '\n');
break;
case 2:
do
{
printf("输入信号机开放状态(0-闭 1-开):");
scanf("%7s",temp);
while(getchar()!= '\n');
}while(temp[1]!='\0' || !(temp[0]=='0' || temp[0]=='1') ); //输入只能为'0'或'1'
p->KB=temp[0]-'0';
break;
case 3:
do
{
printf("输入信号机位置:");
scanf("%7s",temp);
while(getchar()!= '\n');
}while(!(p->Pos=atof(temp))); //输入只能为有效的数字 超过7位只取前7位(含小数点)
break;
case 4:
do
{
printf("输入信号机性质(0-调车 1-列车):");
scanf("%7s",temp);
while(getchar()!= '\n');
}while(temp[1]!='\0' || (!(temp[0]=='0' || temp[0]=='1')) ); //输入只能为"0"或"1"
p->Type=temp[0]-'0';
break;
case 5:
InputElement(p,1);
InputElement(p,2);
InputElement(p,3);
InputElement(p,4);
break; //输入所有信息
}
}
extern int amount;
extern struct Signal *Head;
void create()
{
struct Signal *p1,*p2;
char flag; //用于判断是否继续添加信号机
p1=p2=(struct Signal *)malloc(sizeof(struct Signal));
InputElement(p1,5); //输入信号机信息
Head=p1; //指定链表的头指针
Head->front=NULL; //置空第一项的前驱指针
Head->next=NULL; //置空第一项的后继指针
amount=1;
flag=InputYN("是否继续添加信号机?");
while (flag=='Y')
{
flag='\0'; //将是否继续的flag置空
p2=p1;
p1=(struct Signal *)malloc(sizeof(struct Signal));
InputElement(p1,5); //输入信号机信息
p1->front=p2; //建立新一项的前驱指针
p2->next=p1; //修改前一项的后继指针
p1->next=NULL; //置空新一项的后继指针
amount++;
flag=InputYN("是否继续添加信号机?");
}
}
void load()
{
FILE *fp=NULL;
fpos_t position; //用于记录目前在文件中的位置
struct Signal *p1,*p2;
fp=fopen("Signal.txt","r");
if(fp==NULL)
{
printf("文件不存在!\n");
system("pause");
return;
}
fgetpos(fp,&position);
fseek(fp,0,SEEK_END);
if(ftell(fp)==0)
{
printf("文件为空!\n");
system("pause");
return;
}
fsetpos(fp, &position);
p1=p2=(struct Signal *)malloc(sizeof(struct Signal));
fscanf(fp,"%s\t%d\t%f\t%d\n",p1->Name,&p1->KB,&p1->Pos,&p1->Type);
Head=p1; //指定链表的头指针
Head->front=NULL; //置空第一项的前驱指针
Head->next=NULL; //置空第一项的后继指针
amount=1;
while (!feof(fp))
{
p2=p1;
p1=(struct Signal *)malloc(sizeof(struct Signal));
fscanf(fp,"%s\t%d\t%f\t%d\n",p1->Name,&p1->KB,&p1->Pos,&p1->Type);
p1->front=p2; //建立新一项的前驱指针
p2->next=p1; //修改前一项的后继指针
p1->next=NULL; //置空新一项的后继指针
amount++;
}
fclose(fp);
}
void MenuTitle(char *);
void MainMenu_1();
void MainMenu()
{
char option; //存储用户选择
int flag=1; //为0时退出主菜单 程序结束
while(flag)
{
MenuTitle("主菜单");
printf("1.信号机生成登记\n");
printf("0.保存信号机信息并退出\n");
option=InputOption('0','3');
switch(option)
{
case '1':
MainMenu_1();
break;
case '0':
option=InputYN("保存后将自动退出程序,你确定要继续吗?");
if(option=='Y')
{
flag=0;
}
break;
}
}
}
void MenuTitle(char *title)
{
system("cls");
printf("==========信号机管理系统==========\n");
printf("当前信号机数量:%d\n\n",amount);
printf("【%s】\n",title); //在【】内显示当前菜单的名称
}
void MainMenu_1()
{
char option;
if(amount>0)
{
option=InputYN("该操作会清除原有的信号机数据,你确定要继续吗?");
if(option=='N')
{
return; //返回主菜单
}
else if(option=='Y')
{
removeall(); //清除原有数据
}
} //已有信号机数据时进行提示
MenuTitle("信号机生成登记");
printf("1.从文件中导入\n");
printf("2.人工录入\n");
option=InputOption('1','2');
switch(option)
{
case '1':
load();
break;
case '2':
create();
break;
}
}
这个题目太大了, 请一个函数提一个问题。