C语言实现简单的银行叫号管理系(队列思想)

C语言实现简单的银行叫号管理系统

 

 双队列实现VIP用户的优先叫号

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define false 0

typedef struct QNode
{
 	char data[10];
	 struct QNode *next;	
}QNode;

typedef struct
{
	QNode *front,*rear;
}LinkQueue;

typedef LinkQueue Flist;
//初始化队列,置为空 
LinkQueue* InitQueue()
{
	LinkQueue *queue;
	QNode *node;
	queue=(LinkQueue*)malloc(sizeof(LinkQueue));
	node=(QNode*)malloc(sizeof(QNode));
	node->next=NULL;
	queue->front=queue->rear=node;
	return queue;
}


//入队操作,通过strcpy()函数进行复制,在队尾插入姓名
void InQueue(LinkQueue *Q,char *x)
{
	QNode *p;
	p=(QNode *)malloc(sizeof(QNode));
	if(p==NULL)
	{
		printf("内存不足!");
		exit(1);
	}
	strcpy(p->data,x);
	p->next=NULL;
	Q->rear->next=p;
	Q->rear=p;
} 
void InFQueue(Flist *FQ,char *x)
{
	QNode *p;
	p=(QNode *)malloc(sizeof(QNode));
	if(p==NULL)
	{
		printf("内存不足!");
		exit(1);
	}
	strcpy(p->data,x);
	p->next=NULL;
	FQ->rear->next=p;
	FQ->rear=p;
} 


//通过strcpy()函数进行复制,并通过指针在队头插入客户名
void HeadInQueue(LinkQueue *Q,const char *x)
{
	QNode *p;
	p=(QNode *)malloc(sizeof(QNode));
	strcpy(p->data,x);           //创建新节点并将客户名存入数据域data中 
	p->next=Q->front->next;      //修改front指针,在对头插入 
	Q->front->next=p;
} 


//出队操作
int OutQueue(LinkQueue *Q,char *x)
{
	QNode *p;
	if(Q->front==Q->rear) return 0;
	p=Q->front->next;
	strcpy(x,p->data);
	Q->front->next=p->next;
	if(p->next==NULL)
		Q->rear=Q->front;
	free(p);
	return 1;
} 


//判定队列为空,不是空则把第一个删除,及办理第一个元素
int QueueEmpty(LinkQueue *Q)
{
	if(Q->front==Q->rear)
		return 1;
	else
		return 0;
} 


//通过while()循环将队列输出,显示队列内容
void QueueTraverse(LinkQueue *Q)
{
	QNode *p=Q->front->next;
	while(p!=NULL)
	{
		printf("%s	",p->data);
		p=p->next;
	}
	printf("\n");
} 

//通过while()循环将队列元素与输入姓名进行比较,将查到的元素的位置输出
int Search(LinkQueue *Q,char x[])
{
	QNode *p;
	int  i=0;
	p=Q->front->next;
	while(strcmp(p->data,x)!=0&&p->next!=NULL)
	{
		p=p->next;
		i++;
	}
	if(strcmp(p->data,x)!=0)
	   {
	   	free(p);
	     return 0;
		 }
	else
	 {printf("前面有%d个人在等待\n",i);
	  free(p);
	  return 1;}
	
} 



//通过while()循环将队列遍历,将输入姓名的元素通过指针删除
int Delete(LinkQueue *Q,char x[])
{
	QNode *p,*q;
	int bfound=false;
	p=Q->front->next;
	q=Q->front;
	while(p!=NULL)
	{
		if(strcmp(p->data,x)==0)
		{
			q->next=p->next;
			free(p);
			p=NULL;
			return 1;
		}
		else
		{
			q=p;
			p=p->next;
		}
	}
} 
//以菜单方式显示功能列表,从终端读取输入,执行对应的功能 
int main()
{
	char sel,x,flag='m';
	char name[10];
	LinkQueue *Q=InitQueue();
	LinkQueue *FQ=InitQueue();
	while(1)
	{
		printf("\n***********************\n");
		printf("  1.排队管理     \n");
		printf("  2.呼叫客户     \n");
		printf("  3.打印客户信息 \n");
		printf("  4.查找客户     \n");
		printf("  5.删除客户     \n");
		printf("  0.清空队列     \n");
		printf("\n***********************\n  请选择(操作的序号):");
		scanf("%c",&sel);_flushall();
		switch(sel)
		{
			case '0':
				if(!(QueueEmpty(Q)||QueueEmpty(FQ)))
					printf("请排队的客户明天再来\n");
			    break;
	    	case '1':
	    	  while(flag!='y')
	    		{
				printf("输入客户的姓名:");
	    		scanf("%s",name);
	    		_flushall();
	    		printf("是否优先?(y/n):");
	    		scanf("%c",&x);
	    		getchar();
	    		if(x=='y')
    		 		InFQueue(FQ,name);
  		 		else
  		 			InQueue(Q,name);
 			    printf("是否结束输入(按y结束)\n");
				 scanf("%c",&flag); 
			   }
	 			break;
 			case '2':
 				
				    if(OutQueue(FQ,name)==1)
					    printf("请VIP客户%s办理\n",name);
					else if(OutQueue(Q,name)==1)
				    {  
					   printf("请客户%s办理\n",name);
				    }
					else
					 printf("无排队的客户!\n");	
				
				
					
				break;
			case '3':
				if(QueueEmpty(Q))
				{
					printf("没有排队的客户\n");
				}
				else
				{
					printf("普通排队者:");
					QueueTraverse(Q);
					printf("优先排队者:");
					QueueTraverse(FQ);
				}
				break;
			case '4':
				printf("输入客户姓名:\n");
				scanf("%s",name);
				_flushall();
				if(Search(Q,name)==1)
						printf("并且在普通的队列中!\n");
            	else if(Search(FQ,name)==1)
						printf("并且在优先的队列中!\n");
				else
						printf("没有这个人\n");	
				break;
			case '5':
				printf("输入客户的姓名:");
				scanf("%s",name);
				_flushall();
				if(Delete(Q,name)==1||Delete(FQ,name)==1)
					printf("已取消\n");
				else
					printf("未找到该人\n");
				break;
			
			
			default:
				printf("选择错误,请重新选择.\n");
				break;
		} 
	}	
}

 

 

  • 27
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值