您的位置:首页 > 其它

链队列实现病人排队看病

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

进本过程就是:

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  链队列