排队叫号系统(带源程序)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、课程设计的主要内容
题目描述:利用队列模拟一个排队叫号系统。
功能要求及说明:
(1)系统采用菜单方式操作,要求实现如下功能:
(2)叫号排队:用户叫号时将该用户信息(用户名)入队,并打印用户排队序号、等待人数。
(3)业务处理:工作人员处理完前一业务后,从队列头中获取一个用户出队并呼叫该用户(终端打印输出)。
(4)队列信息浏览:工作人员可随时查看队列中目前未处理的所有业务信息。
(5)采用模块化设计。
二、概要设计
1、本程序包含两个模块
(1)主函数模块:
main(){
定义及初始化;
让用户控制程序,实现排队叫号功能.
}
(2)排队叫号系统单元模块:
主函数调用排队叫号系统单元模块.
2、排队叫号的抽象数据类型定义:
void QueueInitiate(LQueue * Q)
Q为结构体指针;
操作结果:使队列初始化.
int QueueNotEmpty(LQueue Q)
判断队列是否为空;
操作结果:若队列为空,返回0;不为空,则返回1.
int QueueAppend(LQueue * Q,int x)
Q为结构体指针,x传输用户的序号;
操作结果:用户叫号时,使用户序号按顺序入队.
int QueueDelete(LQueue * Q,int * d)
*d传输队头元素;
操作结果:处理对头元素,并释放头结点.
void Destroy(LQueue Q)
操作结果:用户用完程序退出时,摧毁队列,释放内存.
四详细设计
1、实现菜单函数
void menu()
{
printf ("****************************************************\n");
printf ("****************1.排队叫号**************************\n");
printf ("****************2.业务处理**************************\n");
printf ("****************3.队列信息浏览**********************\n");
printf ("****************4.退出******************************\n");
printf ("****************************************************\n");
}
2、队列初始化函数
void QueueInitiate(LQueue * Q) /*队列初始化*/
{
Q->rear=NULL; /*尾指针为空*/
Q->front=NULL; /*头指针为空*/
}
3、判断队列是否为空函数
int QueueNotEmpty(LQueue Q) /*队列不能为空*/
{
if(NULL==Q.front) /*如果头指针为空,则返回0*/
{
return 0;
}
else
{
return 1;
}
}
4、实现排队叫号函数
int QueueAppend(LQueue * Q,int x) /*元素入队*/
{
LQNode * p; /*p指针指向入队元素*/
if((p=(LQNode *)malloc(sizeof(LQNode)))==NULL) /*申请入队元素空间*/ {
return 0;
}
p->data=x;
p->next=NULL;
if(Q->rear!=NULL) /*队尾不为空则将入队元素插至队尾后*/
{
Q->rear->next=p;
}
Q->rear=p; /*队尾为空则队尾指向入队元素*/
if(Q->front==NULL)
{
Q->front=p; /*队头指向入队元素*/
}
return 1;
}
5、实现业务处理函数
int QueueDelete(LQueue * Q,int * d) /*业务处理*/
{
LQNode *p;
if(Q->front==NULL)
{
return 0;
}
else
{
*d=Q->front->data; /*读取队头元素*/
p=Q->front;
Q->front=Q->front->next; /*头结点向后移动一个节点*/
if(Q->front==NULL)
{
Q->rear=NULL;
}
free(p); /*释放头结点*/
return 1;
}
}
6、释放队列函数
void Destroy(LQueue Q) /*摧毁队列*/
{
LQNode *p,*p1;
p=Q.front; /*p指针指向头结点*/
while(p!=NULL)
{
p1=p;
p=p->next;