/***********************************************************
* 版权所有 (C)2016,wangxiuwen
* 文件名称: main.c
* 文件标识:无
* 内容摘要:叫号器操作系统
* 其它说明:无
* 当前版本: V1.0
* 作 者:王修文
* 完成日期: 2016.12.27
* 修改记录: 1
* 修改日期: 2016.12.27
* 版本号: V1.0
* 修改人: 王修文
* 修改内容:创建
**********************************************************/
主函数main.c
#include "LinkList.h"
#include "Mine.h"
/*
提示:
普通用户交款回执码统一默认为:1
加急用户交款回执码统一默认为:2
管理员密码默认为:1
*/
int main()
{
LinkList *L;
InitList(L); //初始化单链表
int n;
for (;;)
{
index(); //调用索引函数
scanf("%d",&n);
if (n==1) //普通挂号
{
ordinary(L); //调用相应函数
}
else if (n==2) //加急挂号
{
urgent(L); //调用相应函数
}
else if (n==3) //退号
{
back(L); //调用相应函数
}
else if (n==4) //管理员
{
administrator(L); //调用相应函数
}
else
{
break;
}
}
return 0;
}
/***********************************************************
* 版权所有 (C)2016,wangxiuwen
* 文件名称: mine.h
* 文件标识:无
* 内容摘要:叫号器操作系统
* 其它说明:无
* 当前版本: V1.0
* 作 者:王修文
* 完成日期: 2016.12.27
* 修改记录: 1
* 修改日期: 2016.12.27
* 版本号: V1.0
* 修改人: 王修文
* 修改内容:创建
**********************************************************/
头函数mine.h
#include <stdio.h>
#include <windows.h>
void index(); //索引
void index_(); //管理员索引
void ordinary(LinkList *L); //普通号
void urgent(LinkList *L); //加急号
void back(LinkList *L); //退号
void administrator(LinkList *L); //管理员
bool add1(LinkList *&L,int shenfen); //普通号入链
bool add2(LinkList *&L,int shenfen); //加急号入链
bool shenfen1(int a); //验证身份证号是否为4位数
bool shenfen2(LinkList *&L,int a); //验证身份证号是否重复
bool pay1(); //普通号交款
bool pay2(); //加急号交款
void sleep05(); //延时0.5s清屏
void sleep3(); //延时3s清屏
bool Aback(LinkList *&L); //普通号退号
bool Tback(LinkList *&L); //加急号退号
bool mima(); //判断管理员密码
/***********************************************************
* 版权所有 (C)2016,wangxiuwen
* 文件名称: mine.c
* 文件标识:无
* 内容摘要:叫号器操作系统
* 其它说明:无
* 当前版本: V1.0
* 作 者:王修文
* 完成日期: 2016.12.27
* 修改记录: 1
* 修改日期: 2016.12.27
* 版本号: V1.0
* 修改人: 王修文
* 修改内容:创建
**********************************************************/
源函数mine.c
#include "LinkList.h"
#include "mine.h"
int num1=1; //普通用户程序内部代号
int num2=1; //加急用户程序内部代号
//索引实现*********************************************************************************************************************************
void index()
{
printf("欢迎光临烟台大学移动公司\n");
printf("\n");
printf("1、普通挂号\n");
printf("2、加急挂号\n");
printf("3、退号 \n");
printf("4、管理员 \n");
printf("任意键退出 \n");
printf("请输入:");
printf("\n");
}
//普通号实现*******************************************************************************************************************************
void ordinary(LinkList *L)
{
sleep05();
printf ("请输入您的身份证号后四位:\n");
int shenfen;
scanf("%d",&shenfen);
sleep05();
if ( !shenfen1(shenfen) ) //判断输入身份证号是否为4位
{
printf ("输入错误!请重新操作\n\n");
sleep3();
return;
}
if ( !shenfen2(L,shenfen) ) //判断输入身份证号是否是否重复
{
printf ("该用户已在队伍中!请重新操作\n\n");
sleep3();
return;
}
if (!pay1()) //判断是否交款成功
{
printf ("回执码错误!请重新操作\n\n");
sleep3();
return;
}
add1(L,shenfen) ; //加入链表队伍中
printf ("********************"); //输出用户信息
printf("\n您的号码为:A%d 号\n",num1);
int j=ListLength(L)-1;
printf("您的前面有:%d 位用户\n",j);
printf ("********************\n\n");
sleep3();
num1++; //下一个用户代号
}
//加急号实现*******************************************************************************************************************************
void urgent(LinkList *L)
{
sleep05();
if(ListEmpty(L)) //判断队伍是否需要开放加急号
{
printf ("您目前是第一位,请申请普通号!请重新操作\n\n");
sleep3();
return;
}
printf ("请输入您的身份证号后四位:\n");
int shenfen;
scanf("%d",&shenfen);
sleep05();
if ( !shenfen1(shenfen) ) //判断输入身份证号是否为4位
{
printf ("输入错误!请重新操作\n\n");
sleep3();
return;
}
if ( !shenfen2(L,shenfen) ) //判断输入身份证号是否是否重复
{
printf ("该用户已在队伍中!请重新操作\n\n");
sleep3();
return;
}
if (!pay2()) //判断是否交款成功
{
printf ("回执码错误!请重新操作\n\n");
sleep3();
return;
}
add2(L,shenfen) ; //加入链表队伍中
printf ("********************"); //输出用户信息
printf("\n您的号码为:T%d 号\n",num2);
int j=num2-1;
printf("您的前面有:%d 位用户\n",j);
printf ("********************\n\n");
sleep3();
num2++; //下一个用户代号
}
//退号实现*********************************************************************************************************************************
void back(LinkList *L)
{
sleep05();
char type;
printf ("清输入您的号码类型(A/T):\n");
scanf ("%s",&type);
sleep05();
if (type=='A') //调用普通号退号函数
{
if (Aback(L))
{
printf ("退号成功!请凭回执码 1 至取款处取款\n\n");
sleep3();
return;
}
else
{
return;
}
}
else if (type=='T') //调用加急号退号函数
{
if (Tback(L))
{
printf ("退号成功!请凭回执码 2 至取款处取款\n\n");
sleep3();
return;
}
else
{
return;
}
}
else
{
printf ("不存在该类型!请重新操作\n\n");
sleep3();
return;
}
}
//管理员实现*******************************************************************************************************************************
void administrator(LinkList *L)
{
sleep05();
while (!mima()) //判断密码是否正确
{
return;
}
index_();
int i;
scanf ("%d",&i);
sleep05();
if (i==1) //请第一位客户
{
if (ListEmpty(L)) //判断队伍中是否有人
{
printf("无人在等待!\n\n");
sleep3();
}
else //删除第一个用户信息
{
LinkList *p=L,*q;
q=p->next;
p->next=q->next;
free (q);
printf("屏幕显示:请第一位客户到人工窗口进行业务办理!\n\n");
sleep3();
}
}
else if (i==2) //查看队伍信息
{
if(ListEmpty(L))
{
printf ("当前队伍中的成员有:\n");
printf ("\n0 人\n\n");
sleep3();
}
else //显示队伍信息
{
printf ("当前队伍中的成员有:\n");
printf ("\n");
DispList(L);
for (;;)
{
int k; //固定队伍信息页面
printf ("输入 1 跳转至首页面:\n");
scanf ("%d",&k);
while (k==1)
{
sleep05();
return ;
}
}
}
}
else if (i==3) //清空队伍
{
DestroyList(L);
printf ("操作成功!当前队伍已经为空\n\n");
sleep3();
}
else //退出管理员系统
{
return;
}
}
//普通号入链实现***************************************************************************************************************************
bool add1(LinkList *&L,int shenfen)
{
LinkList *p=L,*s;
while (p->next!=NULL) //找到当前队伍中的最后一名
{
p=p->next;
}
s=(LinkList *)malloc(sizeof(LinkList));
s->data=shenfen;
s->num=num1;
s->type='A';
s->next=p->next;
p->next=s;
return true;
}
//加急号入链实现***************************************************************************************************************************
bool add2(LinkList *&L,int shenfen)
{
LinkList *p=L,*s;
while (p->next->type=='T') //找到当前队伍中的最后一名
{
p=p->next;
}
s=(LinkList *)malloc(sizeof(LinkList));
s->data=shenfen;
s->num=num2;
s->type='T';
s->next=p->next;
p->next=s;
return true;
}
//检查身份证号是否正确且唯一***************************************************************************************************************
bool shenfen1(int a)
{
if (999<a&&a<10000) //检测输入的数是否为4位数
{
return true;
}
else
{
return false;
}
}
//检查身份证号是否重复*********************************************************************************************************************
bool shenfen2(LinkList *&L,int a)
{
LinkList *p=L->next;
while (p!=NULL)
{
if (p->data==a)
{
return false;
}
else
{
p=p->next;
}
}
return true;
}
//普通号交款*******************************************************************************************************************************
bool pay1()
{
printf ("请至交款处交款5元,并输入交款回执号:\n");
int k;
scanf ("%d",&k);
sleep05();
if (k!=1)
{
return false;
}
return true;
}
//加急号交款*******************************************************************************************************************************
bool pay2()
{
printf ("请至交款处交款100元,并输入交款回执号:\n");
int k;
scanf ("%d",&k);
sleep05();
if (k!=2)
{
return false;
}
return true;
}
//延时3s清屏*******************************************************************************************************************************
void sleep3()
{
printf ("3秒后自动跳转至首页\n");
Sleep (1000);
printf ("2秒后自动跳转至首页\n");
Sleep (1000);
printf ("1秒后自动跳转至首页\n");
Sleep (1000);
/*Sleep (500);*/
system("cls");
}
//延时0.5s清屏*****************************************************************************************************************************
void sleep05()
{
printf ("处理中,请稍候\n");
printf ("[");
for (int j=0;j<35;j++)
{
printf (">");
Sleep (15);
}
printf ("]");
Sleep (300);
system("cls");
}
//普通号退号*******************************************************************************************************************************
bool Aback(LinkList *&L)
{
int i;
printf ("请输入您的身份证号码后四位:\n");
scanf ("%d",&i);
sleep05();
LinkList *q,*p=L;
while ( p!=NULL && p->type!='A') //找到普通号第一位
{
q=p;
p=p->next;
}
while (p!=NULL && p->data!=i) //找到该用户
{
q=p;
p=p->next;
}
if (p==NULL)
{
printf ("您输入的号码不存在!请重新操作\n\n");
sleep3();
return false;
}
else //实现退号
{
int j;
printf ("请输入您的排队号码:\n");
scanf ("%d",&j);
if (p->num==j) //判断排队号与身份证号是否对应
{
sleep05();
q->next=p->next;
free(p);
return true;
}
else
{
sleep05();
printf ("排队号码与身份证号不符!请重新操作\n\n");
sleep3();
return false;
}
}
}
//加急号退号*******************************************************************************************************************************
bool Tback(LinkList *&L)
{
int i;
printf ("请输入您的身份证号码后四位:\n");
scanf ("%d",&i);
sleep05();
LinkList *q,*p=L;
while (p!=NULL && p->type!='T') //找到加急号第一位
{
q=p;
p=p->next;
}
while (p!=NULL && p->data!=i) //找到该用户
{
q=p;
p=p->next;
}
if (p==NULL)
{
printf ("您输入的号码不存在!请重新操作\n\n");
sleep3();
return false;
}
else
{
int j;
printf ("请输入您的排队号码:\n");
scanf ("%d",&j);
if (p->num==j) //判断排队号与身份证号是否对应
{
sleep05();
q->next=p->next;
free(p);
return true;
}
else
{
sleep05();
printf ("排队号码与身份证号不符!请重新操作\n\n");
sleep3();
return false;
}
}
}
//管理员索引实现***************************************************************************************************************************
void index_()
{
printf("1、有请当前队伍的第一位\n");
printf("2、查看目前队伍信息\n");
printf("3、清空队伍\n");
printf("任意键退出\n");
printf("请输入:");
printf("\n");
}
//判断管理员密码是否正确*******************************************************************************************************************
bool mima()
{
int i;
printf ("请输入管理员密码:\n");
scanf ("%d",&i);
sleep05();
if (i==1)
{
return true;
}
else
{
printf ("密码输入错误!请重新操作\n\n");
sleep3();
return false;
}
}
/***********************************************************
* 版权所有 (C)2016,wangxiuwen
* 文件名称: LinkList.h
* 文件标识:无
* 内容摘要:叫号器操作系统
* 其它说明:无
* 当前版本: V1.0
* 作 者:王修文
* 完成日期: 2016.12.27
* 修改记录: 1
* 修改日期: 2016.12.27
* 版本号: V1.0
* 修改人: 王修文
* 修改内容:创建
**********************************************************/
头函数LinkList.h
#include <stdio.h>
#include <malloc.h>
typedef int ElemType;
typedef struct LNode //定义单链表结点类型
{
ElemType data;
ElemType num;
char type;
struct LNode *next; //指向后继结点
}LinkList;
void InitList(LinkList *&L); //初始化线性表
void DestroyList(LinkList *&L); //销毁线性表
bool ListEmpty(LinkList *L); //判断线性表是否为空
int ListLength(LinkList *L); //求线性表长度
void DispList(LinkList *L); //输出线性表
bool GetElem(LinkList *L,int i,ElemType &e); //求线性表某个数据元素值
int LocateElem(LinkList *L,ElemType e); //按元素值查找
bool ListInsert(LinkList *&L,int i,ElemType e); //插入数据元素
bool ListDelete(LinkList *&L,int i,ElemType &e); //删除数据元素
/***********************************************************
* 版权所有 (C)2016,wangxiuwen
* 文件名称: LinkList.c
* 文件标识:无
* 内容摘要:叫号器操作系统
* 其它说明:无
* 当前版本: V1.0
* 作 者:王修文
* 完成日期: 2016.12.27
* 修改记录: 1
* 修改日期: 2016.12.27
* 版本号: V1.0
* 修改人: 王修文
* 修改内容:创建
**********************************************************/
源函数LinkList.c
#include "LinkList.h"
//初始化链表*******************************************************************************************************************************
void InitList(LinkList *&L)
{
L=(LinkList *)malloc(sizeof(LinkList)); //创建头结点
L->type ='T';
L->next=NULL;
}
//销毁单链表*******************************************************************************************************************************
void DestroyList(LinkList *&L)
{
while (L->next==NULL)
{
return ;
}
LinkList *p=L->next ,*q=p->next; //p指向*q的前驱节点
while (q!=NULL) //循环判断 逐个销毁
{
free(p); //释放*p节点
p=q; //p、q同步后移一个节点
q=p->next; //再赋值
}
free(p); //此时q为NULL,p指向尾结点,释放它
L->next=NULL;
}
//判断链表是否为空*************************************************************************************************************************
bool ListEmpty(LinkList *L)
{
return(L->next==NULL);
}
//求链表长度*******************************************************************************************************************************
int ListLength(LinkList *L)
{
LinkList *p=L;
int i=0;
while (p->next!=NULL)
{
i++;
p=p->next;
}
return(i);
}
//输出链表*********************************************************************************************************************************
void DispList(LinkList *L)
{
int i=1;
LinkList *p=L->next;
while (p!=NULL)
{
printf("第%d位:%d 号码:%c%d\n",i,p->data,p->type,p->num);
p=p->next;
i++;
}
printf("\n");
}
//求链表中某个元素的值*********************************************************************************************************************
bool GetElem(LinkList *L,int i,ElemType &e)
{
int j=0;
LinkList *p=L;
while (j<i && p!=NULL)
{
j++;
p=p->next;
}
if (p==NULL) //不存在第i个数据结点
return false;
else //存在第i个数据结点
{
e=p->data;
return true;
}
}
//按元素查找*******************************************************************************************************************************
int LocateElem(LinkList *L,ElemType e)
{
LinkList *p=L->next;
int n=1;
while (p!=NULL && p->data!=e)
{
p=p->next;
n++;
}
if (p==NULL)
return(0);
else
return(n);
}
//插入数据元素*****************************************************************************************************************************
bool ListInsert(LinkList *&L,int i,ElemType e)
{
int j=0;
LinkList *p=L,*s;
while (j<i-1 && p!=NULL) //查找第i-1个结点
{
j++;
p=p->next;
}
if (p==NULL) //未找到位序为i-1的结点
return false;
else //找到位序为i-1的结点*p
{
s=(LinkList *)malloc(sizeof(LinkList)); //创建新结点*s
s->data=e;
s->next=p->next; //将*s插入到*p之后
p->next=s;
return true;
}
}
//删除数据元素*****************************************************************************************************************************
bool ListDelete(LinkList *&L,int i,ElemType &e)
{
int j=0;
LinkList *p=L,*q;
while (j<i-1 && p!=NULL) //查找第i-1个结点
{
j++;
p=p->next;
}
if (p==NULL) //未找到位序为i-1的结点
return false;
else //找到位序为i-1的结点*p
{
q=p->next; //q指向要删除的结点
if (q==NULL)
return false; //若不存在第i个结点,返回false
e=q->data;
p->next=q->next; //从单链表中删除*q结点
free(q); //释放*q结点
return true;
}
}
运行过程截图: