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;
		} 
	}	
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章