现在到医院看病基本都得预约排队,那如何用数据结构的形式表示呢?下面就用链队列来表示:
进本过程就是:
1. 病人到达医院,将病历交到护士手中,进行排队。
2. 护士按照序号,一次安排病人就诊。
3. 滚动条上可以看到就诊情况。
4. 医生下班或无就诊病人时退出。
其中“病人到达”用命令'a'表示,“护士让患者就诊”用命名'n'表示,命令'b'表示查看排队情况,命令'm'退出。
注:这里采用一个队列,有“病人到达”命令时即入队,有“护士让患者就诊”命令是即出队,命令'b'即队列所有元素出队,命令'm'即终止运行。
用链队列实现上述功能,每次N命令前需要判断是否还有病人,没有病人终止运行;
代码实现:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<conio.h>
#define INIT_SIZE 100
#define INCREASE_SIZE 10
#define status int
#define OK 1
#define ERROR 0
typedef struct QNode //定义队列结构体
{
int data;
struct QNode *next;
}QNode, *QueuePtr;
typedef struct
{
QueuePtr front; //队头指针
QueuePtr rear; //队尾指针
}LinkQueue;
status InitQueue(LinkQueue &Q) //初始化队列
{
Q.front = Q.rear = (QNode*)malloc(sizeof(QNode));
if (!Q.front)
return ERROR;
Q.front->next = NULL;
return OK;
}
status DestoryQueue(LinkQueue &Q) //销毁队列
{
while (Q.front)
{
Q.rear = Q.front;
free(Q.front);
Q.front = Q.rear->next;
}
return OK;
}
status EnQueue(LinkQueue &Q, int e) //队列尾插入元素
{
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
if (!p)
return ERROR;
p->next = NULL;
p->data = e;
Q.rear->next = p;
Q.rear = p;
return OK;
}
status DeQueue(LinkQueue &Q, int &e) //取出对头元素
{
if (Q.front == Q.rear)
return ERROR;
QueuePtr p = Q.front->next;
Q.front->next = p->next;
e = p->data;
if (Q.rear == p)
Q.rear = Q.front;
free(p);
return OK;
}
char menu() //选择菜单
{
char i;
printf("请选择相应操作:\n");
printf(" a.病人到达,进行排队 \n");
printf(" n.就诊\n");
printf(" b.查看排队情况 \n");
printf(" m.退出\n");
i = _getch();
return i;
}
void Insert(LinkQueue &Q) //预先插入一些数据到队列中
{
int i, a;
for (i = 1; i < 4; i++)
{
a = EnQueue(Q, i);
if (a == 0)
exit(0);
}
}
void Display(LinkQueue Q) //展示Q中的数据
{
QueuePtr p;
p = Q.front->next;
printf("目前排队情况,请排队病人耐心等候:");
while (p != NULL)
{
printf("%d号 ", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
int a, b = 3, c, i = 1;
LinkQueue Q;
a = InitQueue(Q); //初始化队列Q
if (a == 0)
return ERROR;
Insert(Q); //预先插入一些元素备用
Display(Q); //展示Q中现有元素
char ch; //用户选择相应操作
while (1)
{
ch = menu();
switch (ch)
{
case 'a':
b++;
a = EnQueue(Q, b);
if (a == 0)
{
printf("出现错误!");
exit(0);
}
Display(Q);
break;
case 'n':
a = DeQueue(Q, c);
if (a == 0)
{
printf("出现错误!");
exit(0);
}
printf("现在%d号就诊\n", c);
//Display(Q);
break;
case 'b':
Display(Q);
break;
case 'm':
exit(0);
default:
printf("ERROR,请重新输入!\n");
}
}
return 0;
}