排队叫号系统带源程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

*/ 逐个释放队列的节点free(p1); /*}

整个程序的流程图如下:

五调试分析

1、该程序的关键就是弄清楚队列及链表的操作方法和原理。首先保证没有句法错误,其次要保证写的函数没有错误,能正常完成要求所需的功能,然后尽量完善各功能,使用户用起来更方便。

2、叫号时,输入不同的用户名,随时进行业务处理和队列信息浏览,查看相应功能是否正确。

3、本实习作业采用循序渐进的策略,首先分别写好三个相应功能的函数,然后再加入主函数中,以保证整个程序的正确性,也便于随时调整,改正各种错误。调试程序很耗时间,比较的麻烦,往往改动一个地方能影响到很多位置。

六测试结果

1、通过写该程序,充分理解队列及链表的操作原理,熟悉队列的操作。

2、主函数调用子函数时,涉及到参数的传递,要注意到程序里面还有局部变量与全局变量的区别,要时刻注意变量的值,循环调用就要注意到各个子函数的返回值。

3、该程序完整地实现了排队叫号系统的功能,程序简洁、明了,用户使用起来方便。

七用户使用说明

1、本程序在VC下能正常运行。

2、程序运行后,出现主菜单,用户首先选择排队叫号功能,输入账号,回车结束,程序会显示用户的序号以及前面排队的人数;

3、叫号多次,再选择业务处理功能,程序会打印第一个用户的序号,并叫其来办理业务;

4、业务处理完后,返回主菜单,选择队列信息浏览功能,程序会打印出当前未办理业务的人数、用户队列序号和相应用户的账号;

5、做完后,退出程序。

源程序:

# include

# include

typedef char DataType;

# include CallSystem.h

int main(void)

{

int i=0,countx=0,j=0;

int a;

char username[20][20];

LQueue lqueue;

相关文档
最新文档