《数据结构》实验报告
题
目: 银行客户排队等候系统模拟
班
级:
姓
名:
学
号:
完成日期: 2012 年 4 月 12 日
1.问题描述
客户到银行办理业务,需要取号排队等候。客户分为 VIP 客户、理财客户、一般
客户三种类型。不同类型客户,取得不同的排队序号凭证,进入不同序列排队等
候。当服务窗口出现空闲时,按既定策略从三种类型客户中选取客户接受服务。
选取客户接受服务的策略如下:
(1)三种类型客户的服务优先顺序从高到低依次为:VIP 客户、理财客户、一般
客户;
(2)相同类型的客户采取先来先服务的原则;
(3)当一般客户连续 5 次未被选中时,下一次优先选取一般客户接受服务。
用 C 语言编写程序,模拟上述操作过程。
2.需求分析
(1)输入的形式和输入值的范围:客户进行排队时输入 1、2、3 分别代表 VIP
客户、理财客户、一般客户三种类型的客户,以得到相对应的排队号;银行端每
处理完一位用户,输入 Y,使得系统重新打印当前排队队列;
(2)输出的形式:输出当前所有排队用户的客户信息以及号数;
(3)程序所能达到的功能:演示出较为合理的银行等候系统模拟;
3.概要设计
(1)队列的 ADT 定义:
ADT Queue{
数据对象:D={ ai | ai ∈ElemSet, i=1,2,...,n,
数据关系:R1={
|ai-1 ,ai∈D,
i=2,… ,n }
约定 an 端为队头,a1 端为队尾。
n≥0 }
基本操作:InitQueue(&S);初始化队列
EnQueue(&S,e);入队
DeQueue(&S,e);出队并删除队头元素;
} ADT Stack
(2)系统中子程序及功能要求:
Int main();主函数,负责调用子函数;
int InitQueue(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3);
队列初始化;
int paidui(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3);
元素入队;
int DEQueue(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3,Queueptr t);
删除队头元素
int panduan(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3);
判断队列是否为空,且 LinkYnode 是否五次未有元素出列;
int dayin(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3);
将队列中元素依次打印出来;
(3)主程序及各程序模块(函数)之间的层次(调用)关系。
该程序包含两个模块:主函数模块和判断模块;
模块之间的调用关系为:主程序模块 判断模块
函数之间的调用关系如下图所示:
Main()
Panduan()
InitQueue()
Paidui() DeQueue()
Dayin()
4.详细设计
(1)队列链式存储结构定义:
typedef struct Qnode{//定义队列的链式存储结构
int num;
struct Qnode *next;
}Qnode,*Queueptr;
typedef struct{
Queueptr front;
Queueptr rear;
}LinkVnode;
typedef struct{
Queueptr front;
Queueptr rear;
}LinkLnode;
typedef struct{
Queueptr front;
Queueptr rear;
}LinkYnode;
(2)主函数的算法:
int main ()
{
LinkVnode Q1;LinkLnode Q2;LinkYnode Q3;
int DEQueue(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3,Queueptr t);
int InitQueue(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3);
int panduan(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3);
int paidui(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3);
int dayin(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3);
InitQueue(Q1,Q2,Q3);
paidui(Q1,Q2,Q3);
while (control==0)
{
panduan(Q1,Q2,Q3);
}
return 0;
}
(3)判断模块:
int panduan(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3)
{
int DEQueue(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3,Queueptr l);
int paidui(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3);
int dayin(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3);
char operation;
printf("处理完毕请输入 y 需要新客户服务请输入 n:");
scanf("%s",&operation);
if (operation=='y')
{
count++;
if(count>5)
{
DEQueue(Q1,Q2,Q3,Q3.front);
//s3=s3->next;
dayin(Q1,Q2,Q3);
count=0;
}
else{
if(Q1.front!=Q1.rear)
{
DEQueue(Q1,Q2,Q3,Q1.front);
if(Q1.rear ==l){Q1.front=Q1.rear;}
}
else if(Q2.front!=Q2.rear)
{
DEQueue(Q1,Q2,Q3,Q2.front);
if(Q2.rear == l){Q2.front=Q2.rear;}
}
else if(Q3.front!=Q3.rear)
{
DEQueue(Q1,Q2,Q3,Q3.front);
if(Q3.rear == l){Q3.front=Q3.rear;}
count=0;
//s3=s3->next;
}
dayin(Q1,Q2,Q3);
}
}
else
{
paidui(Q1,Q2,Q3);
}
dayin(Q1,Q2,Q3);
return 0;
}
(4)队列初始化:
int InitQueue(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3)
{
Q1.front=Q1.rear=(Queueptr)malloc(sizeof(Qnode));
if(!Q1.front) return 0;
else{ Q1.front->next=NULL;
}
Q2.front=Q2.rear=(Queueptr)malloc(sizeof(Qnode));
if(!Q2.front) return 0;
else{ Q2.front->next=NULL;
}
Q3.front=Q3.rear=(Queueptr)malloc(sizeof(Qnode));
if(!Q3.front) return 0;
else{ Q3.front->next=NULL;
}
return 1;
}
(5)排队函数:
int paidui(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3)
{
int select;
Queueptr p,q,r;
printf("请输入用户类型,以得到服务编号\n(1 为 VIP 用户,2 为理财客户,
3 为一般客户,0 为结束程序)\n");
scanf("%d",&select);
switch (select){
case 1:
p=(Queueptr)malloc(sizeof(Qnode));
a++;
p->num =a;
p->next = NULL;
Q1.rear->next =p;
Q1.rear=p;
break;
case 2:
q=(Queueptr)malloc(sizeof(Qnode));
b++;
q->num =b;
q->next = NULL;
Q2.rear->next =q;
Q2.rear=q;
break;
case 3:
r=(Queueptr)malloc(sizeof(Qnode));
c++;
r->num =c;
r->next = NULL;
Q3.rear->next =r;
Q3.rear=r;
break;
case 0:
return control=1;
}
return 0;
}
(6)删除队头元素函数:
int DEQueue(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3,Queueptr
t)
//删除
{
l=t->next;
t->next= l->next;
free(l);
return 0;
}
(7)打印队列函数:
int dayin(LinkVnode &Q1,LinkLnode &Q2,LinkYnode &Q3)
//打印等待列
表
{
Queueptr s;
printf("当前客户等待情况:\n");
if(Q1.front==Q1.rear&&Q2.front==Q2.rear&&Q3.front==Q3.rear)
{
printf("无等待\n");
}
else
{
if(Q1.front!=Q1.rear)
{
for(s=Q1.front;s!=Q1.rear;s=s->next){
printf("处理编号:A%d,客户类型:VIP 用户\n",s->next->num);
}
}
if(Q2.front!=Q2.rear)
{
for(s=Q2.front;s!=Q2.rear;s=s->next)
{
printf("处理编号:B%d,客户类型:理财用户\n",s->next->num);
}
}
if(Q3.front!=Q1.rear)
{
for(s=Q3.front;s->next!=NULL;s=s->next)
{
printf("处理编号:C%d,客户类型:一般用户\n",s->next->num);
}