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