C语言大作业 数据结构 医院候诊排队系统 代码【可运行代码+截图】

设计内容:

设计一个医院候诊排队系统。问题描述:医院各科室的医生有限,因此病人到医院看病时必须排队候诊,而病人的病情有轻重之分,不能简单的根据先来先服务的原则进行诊断治疗,所以医院根据病人的病情规定了不同的优先级别。医生在诊断治疗时,总是选择优先级别高的病人先治疗,如果遇到两个优先级别相同的病人,则选择最先来排队的病人进行诊治。

设计要求:

  • (1)用队列模拟上述排队候诊的问题,建立队列分别对应不同优先级别,按照从终端读入的输入数据的方式进行模拟管理。
    输入1,表示有新的病人加入队列候诊,根据病情指定其优先级别;
    输入2,表示医生根据优先级别为病人进行诊治;
    输入3,表示退出系统。
  • (2)要求界面友好美观,操作方便易行;
  • (3) 注意程序的实用性、安全性;

本设计采用的数据结构

(1)数据结构类型:链式队列
(2)原因:病人排队,医生看诊要先来排队的优先看病,也就满足数据结构中的“先进先出”原则,所以要选用队列。但由于人数不定,所以不适合用顺序存储队列,而链式队列较合适。
(3)定义:

typedef int QElemType;
typedef int Status;
typedef struct QNode{
	QElemType data;  //病人的编号 
	struct QNode *next; //下一个病人编号的地址 
}QNode,*Queueptr;
typedef struct{
	Queueptr front;
	Queueptr rear;
}LinkQueue;

系统功能模块结构图及主要函数说明

C语言大作业 数据结构 医院候诊排队系统 代码【可运行代码+截图】

4.2主要函数

  • (1)构造空队列 Status InitQueue(LinkQueue &q)
    为操作方便,可以为链队列添加一个头结点,并令头指针指向头结点。空的链队列的判决条件:头指针和尾指针均指向头结点。
  • (2)入队 Status EnQueue(LinkQueue &q,QElemType e) ;
    插入元素e作为新的队尾元素。为结点p分配空间,p->data编号加一,p->next为空,将p结点连接到q的最后。
  • (3)出队 Status DeQueue(LinkQueue &q,QElemType &e);
    从队列中从前往后出队,当队头指针与队尾指针不相等时,将队头指针的data值
    赋给x,队头指针后移。返回x的值。
  • (4)void MyEnQueue(LinkQueue &q1,LinkQueue &q2,QElemType e,int priority);
    根据病人的优线级分别入队 根据传入的priority的值进去相应的队列。
  • (5)Status MyDeQueue(LinkQueue &q1,LinkQueue &q2);
    按照病情轻重出队。即q2,q1的顺序。在同一优先级里,根据data的顺序出队
    及从小到大的顺序。在判断q2不为空的情况下,data从小到大出队,e返回data值
    他情况类似)在两个队都为空时,e=-1。

4.3 函数说明

int main()  //主函数 
Status InitQueue(LinkQueue &q);//创建一个空队列 
Status EnQueue(LinkQueue &q,QElemType e);  //插入元素e作为新的队尾元素 
Status DeQueue(LinkQueue &q,QElemType &e); //删除元素e,并返回
Status EmptyQueue(LinkQueue &q);// 判断队列是否为空,若为空返回0
void MyEnQueue(LinkQueue &q1,LinkQueue &q2,QElemType e,int priority);
//根据优先级入队
Status MyDeQueue(LinkQueue &q1,LinkQueue &q2);//根据优先级出队

N-S流程图如下
C语言大作业 数据结构 医院候诊排队系统 代码【可运行代码+截图】
C语言大作业 数据结构 医院候诊排队系统 代码【可运行代码+截图】
C语言大作业 数据结构 医院候诊排队系统 代码【可运行代码+截图】
C语言大作业 数据结构 医院候诊排队系统 代码【可运行代码+截图】

程序运行数据及其结果

数据输入类型:键盘输入
C语言大作业 数据结构 医院候诊排队系统 代码【可运行代码+截图】
C语言大作业 数据结构 医院候诊排队系统 代码【可运行代码+截图】
C语言大作业 数据结构 医院候诊排队系统 代码【可运行代码+截图】
C语言大作业 数据结构 医院候诊排队系统 代码【可运行代码+截图】
C语言大作业 数据结构 医院候诊排队系统 代码【可运行代码+截图】
C语言大作业 数据结构 医院候诊排队系统 代码【可运行代码+截图】
运行结果分析:
当病情严重的队列不为空时,优先q2出队;当q2为空时,q1出队;当队都为空时,提示“无诊治病人,队列为空”。

源代码

#include <stdio.h>
#include <stdlib.h>
#include<windows.h>
#include<string.h>

#define OK 1
#define ERROR 0
#define OVERFLOW -2

typedef int QElemType;
typedef int Status;
typedef struct QNode{
	QElemType data;  //病人的编号 
	struct QNode *next; //下一个病人编号的地址 
}QNode,*Queueptr;
typedef struct{
	Queueptr front;
	Queueptr rear;
}LinkQueue;

//创建一个空队列 
Status InitQueue(LinkQueue &q)   
{
	q.front=q.rear=(Queueptr)malloc(sizeof(QNode));
	if(q.front==NULL)
	{
		exit(OVERFLOW);
	}
	q.front->next=NULL;
	return OK;
}

//插入元素e作为新的队尾元素 
Status EnQueue(LinkQueue &q,QElemType e) 
{
	Queueptr p;
	p=(Queueptr)malloc(sizeof(QNode));
	if(!p)
	{
		exit(OVERFLOW);
	}
	p->data=e;
	q.rear->next=p;
	q.rear=p;
	return OK;
}

Status DeQueue(LinkQueue &q,QElemType &e)
{
	Queueptr p;
	if(q.rear==q.front)
	{
		return ERROR;
	}
	p=q.front->next;
	e=p->data;
	q.front->next=p->next;
	if(q.rear==p)
	{
		q.rear=q.front;
	}
	free(p);
	return e;
}

Status EmptyQueue(LinkQueue &q)
{
	int r=0;
	if(q.front==q.rear)
	{
		r=0;
	}
	else
	{
		r=1;
	}
	return r;
}

void MyEnQueue(LinkQueue &q1,LinkQueue &q2,QElemType e,int priority)
{
	//确定是哪个优先级的病人并且入相应的队列
	if(priority==1)
	{
		EnQueue(q1,e);
	}
	else
	{
		EnQueue(q2,e);
	}

}

Status MyDeQueue(LinkQueue &q1,LinkQueue &q2)
{
	//出队
	QElemType e;
	if(EmptyQueue(q1))
	{
		e=DeQueue(q1,e);
	}
	else if(EmptyQueue(q2))
	{
		e=DeQueue(q2,e);
	}
	else
	{
		e=-1;
	}
	return e;
}


struct PT{
	char name[20];
	int age;
	char sex;
	char xueli[10];  //学历
	char address[70];//住址
	int telephone;      //电话号码
	char department[70];     //部门
	int priority;
};

int main()  //主函数 
{
	LinkQueue q1,q2;  //分别表示低级和高级的病人队列 
	QElemType idi=1,ido=-1;  //分别表示入队和出队的病人的id 
	int menu=0; //分别为用户选择的菜单编号和病人看病的优先级别

	InitQueue(q1);
	InitQueue(q2); 
	struct PT pt[100];
	
	printf("\n\n"); 
	printf("       ---------------------------------------------------------------------------------\n\n");
	printf("       *********************************************************************************\n\n");
	printf("\n");
	printf("       **                      欢迎使用××医院排队系统                               **\n");
	printf("\n");  
	printf("       **                      1. 新的病人加入队列候诊                                **\n");
	printf("\n");
	printf("       **                      2. 医生根据优先级别为病人进行诊治                      **\n");
	printf("\n");
	printf("       **                      3. 打印病人的目录(只有管理员才可以哦)                  **\n");
	printf("\n");
	printf("       **                      4. 退出系统                                            **\n");
	printf("\n");
	printf("       *********************************************************************************\n\n");
	printf("       ---------------------------------------------------------------------------------\n\n");
	
	int i,k=0;  //i代表之后循环点的次数  k代表循环次数,本程序中,错误超过三次,会退出系统。
	char users[50],mima[30];  //定义用户名,密码 。
	system("color 2f");  //设置背景颜色。

	while(1)
	{
		printf("       ---------------------------------------------------------------------------------\n\n");
		printf("           请按编号选择相应的操作:\n");
		printf("           "); 
		scanf("%d",&menu);
		
		switch(menu)
		{
			case 1:{
				printf("           新病人加入候诊队列\n");
				printf("\n\n");
				printf("           请登记病人的基本情况:\n\n\n");
				printf("           姓名  性别(男m女f)  年龄 学历 住址 电话号码 部门 病人的优先级\n");
			
				printf("           姓名: ");
				scanf("%s",&pt[idi].name);
//				fflush(stdin);     (功能是清除缓存)
				getchar(); 
				printf("           性别:(m/f)");
				scanf("%c",&pt[idi].sex);
				printf("           年龄: ");
				scanf("%d",&pt[idi].age);
				printf("           学历(博士/研究生/本科/大专/高中/初中/小学): ");
				scanf("%s",pt[idi].xueli);
				printf("           家庭地址: ");
				scanf("%s",pt[idi].address);
				printf("           电话号码: ");
				scanf("%d",&pt[idi].telephone);
				printf("           挂号部门: ");
				scanf("%s",pt[idi].department);
				printf("           病情严重性(非常严重请输入1,否则输入2): ");
				scanf("%d",&pt[idi].priority); 
				printf("\n");
				printf("           谢谢您的配合。挂号成功!请您耐心等待!\n"); 
				printf("           该病人的ID是:%d\n",idi);
				MyEnQueue(q1,q2,idi,pt[idi].priority);
				idi++;
				break;
			}
			
			case 2:{
				ido=MyDeQueue(q1,q2);
				if(ido!=-1)
				{
					printf("           当前被诊治的病人的id是:%d\n",ido);
				}
				else
				{
					printf("           无诊治病人,队列为空!");
				}
				break;
			} 
				
			case 3:{
				int i=1;
					for(i=0;i<3;i++)
	
					{
						getchar(); 
						printf("\n           请先登录,只有管理员才可以打印病人信息哦!");
						printf("\n\n           请输入用户名:"); 
						gets(users);
						
						printf("\n           请输入密码:");
						
						gets(mima);
						
						if((strcmp(users,"123")==0)&&(strcmp(mima,"123")==0))
						{
							printf("\n           您已经成功登录");
							printf("\n           请稍等");
							for(i=0;i<20;i++)
							{
								printf(".");
								Sleep(100);
							}
							printf("\n\n\n");				
							break;        
						}						
						k++;
						if(k<3)
						{
							printf("\n       用户名或密码无效 请重新输入:\n");
						}
						
						if(k==3)
						{
							printf("\n       连续输入错误3次 将退出程序\n");
							Sleep(2000);
							exit(0);
						}
					}
					
					
				printf("           打印当前病人的目录:\n\n\n");
				printf("       ---------------------------------------------------------------------------------\n\n");
					printf("        序号    姓名   性别   年龄    学历    住址    电话号码     挂号部门    病情优先级   \n\n");
				for(i=1;i<idi;i++)
				{
					printf("           %d    %s    %c     %d     %s    %s     %d    %s    %d   \n\n",i,pt[i].name,pt[i].sex,pt[i].age,pt[i].xueli,pt[i].address,pt[i].telephone,pt[i].department,pt[i].priority);
				}
				printf("       ---------------------------------------------------------------------------------\n\n");
				break;
			}
			
			case 4:{
				printf("\n           谢谢使用,再见!\n");
	
				break;
			}
			
			default:{
				printf("           输入有误,请按菜单编号输入。\n");
			}		
		}	
	}
}




上一篇:队列的操作及实现——链式队列


下一篇:聊一聊队列