链队列实现病人排队看病

时间:2022-07-24 21:33:29

现在到医院看病基本都得预约排队,那如何用数据结构的形式表示呢?下面就用链队列来表示:

进本过程就是:

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