数据结构二------循环队列实现医院候诊诊治系统

只要代码如下:

/*****  数据结构实验二 ********/

/******** written by C_Shit_Hu ************/

采用循环队列实现///

/****************************************************************************/
/* 
空队列:front == rear
满队列:q.rear + 1) % INIT_SQ_QUEUE_LEN == q.front
伪队头指针:pfront

非空队列中,front始终指向队列头元素,rear始终指向队列尾元素的下一个位置。
判断循环队列是否充满,有两种方法:
1. 设立一个标记,当front==rear时,用于标示队列是空还是满,比如当前队列元素个数等。
2. 少用一个空间,如果rear后一位置是front时则认为是满。
*/
/****************************************************************************/

#include <iostream>
#include <stdlib.h>
#include <malloc.h>
using namespace std;

#define INIT_SQ_QUEUE_LEN 100  
typedef int node_type;

typedef struct __sq_queue_st {
	node_type *base;
	node_type pfront;
	int front;
	int rear;
} sq_queue_st;

void init_sq_queue(sq_queue_st &q);   // 初始化循环链表函数
int en_queue(sq_queue_st &q);  // 插入元素调用函数
int de_queue(sq_queue_st &q); // 删除元素
int quene_lenght(sq_queue_st &q);    // 返回长度
int queue_empty(sq_queue_st &q);    // 判断是否为空
void quene_trvase(sq_queue_st &q);  // 链表遍历输出

// 初始化
void init_sq_queue(sq_queue_st &q)
{
	q.base = (node_type *)malloc(sizeof(node_type) * INIT_SQ_QUEUE_LEN);
	if(!q.base) exit(1);
	q.front = q.rear = 0;
}

// 插入
int en_queue(sq_queue_st &q, node_type data)
{
	int i, len;
	if((q.rear + 1) % INIT_SQ_QUEUE_LEN == q.front)
		return -1;
    len = quene_lenght(q);
	q.pfront = q.front;
	for (i=1; i<=len && (q.pfront) % INIT_SQ_QUEUE_LEN != (q.rear+1); i++, q.pfront++ )
	{
		if (q.base[q.pfront]  == data )
		{
			printf(">>病人%d已经在队列中,请不要重复排队!\n", data);
			return -1;
			exit(1);
		}
	}
	q.base[q.rear] = data;
	q.rear = (q.rear + 1) % INIT_SQ_QUEUE_LEN;
	cout << ">>病人"<< data <<"排队成功。\n";
    len = quene_lenght(q);
	printf(">>此时的循环队列长度为:%d.\n", len);
	return 0;
}

// 删除
int de_queue(sq_queue_st &q)
{
	//int data;
	if(q.rear == q.front)
	{
		cout <<">>没有人排队哦。\n";
		return -1;
	}
	//q.pfront = q.front;
	//data = q.base[q.front];	
	cout << ">>病人" <<q.base[q.front]<< "正在就诊\n";
	q.front = (q.front+1) % INIT_SQ_QUEUE_LEN;
	return 0;
}
// 长度
int quene_lenght(sq_queue_st &q)
{
	return (q.rear - q.front + INIT_SQ_QUEUE_LEN) % INIT_SQ_QUEUE_LEN;
}

// 判空
int queue_empty(sq_queue_st &q)
{
	return q.front == q.rear;
}

// 遍历
void quene_trvase(sq_queue_st &q)
{
	int i, len;
	len = quene_lenght(q);
	cout << ">>共有"<< len <<"个人正在排队,依次是:\n  >>病人: ";
	q.pfront = q.front;
		
	for (i=1; i<=len && (q.pfront) % INIT_SQ_QUEUE_LEN != (q.rear+1); i++, q.pfront++ )
		     cout << q.base[q.pfront] << ' ';
	cout << endl ;
}

// 初始化
void Sys_Init()
{
	cout << "*************欢迎进入候诊系统*************" << endl;
	cout << "1:病人排队       2:病人就诊 \n3:查看排队       4.排队结束,依次就诊 \n5.下班           6.清屏并初始化系统"<< endl;
	cout << "**********本系统限定最大队列100人*********" << endl;
}

int main()
{
	int sel, flag=1, num, i;
	sq_queue_st q;
	system("echo off");
	system("color 2");
	init_sq_queue(q);
	Sys_Init();
	while (flag==1) 							/*循环执行*/
	{
lb:	cout << ">>>>>>请选择相应的功能继续(输入序号):" ;
		cin >> sel;
		if (sel>6 || sel <=0)
		{
			cout << "您输入选项不正确!" << endl;
			goto lb;
		} 
		
		switch(sel) 
		{
		case 1:{	
					cout << "  >>>>请输入病历号:";
					cin >> num;
					en_queue(q, num);
					
			   }break;
		case 2:{
					de_queue(q);
			   }break;
		case 3:{
					if (queue_empty(q))
						cout << ">>没有人排队哦." << endl;
					else
					quene_trvase(q) ;
			   }break;
		case 4:{
					cout << ">>排队结束,请按照先后顺序诊治!\n" << endl;
					flag = 0;
					quene_trvase(q);
			   }break;
		case 5:{
					cout << ">>下班时间到咯。请余下的病人,明天再来!" << endl;
			   }break;
		case 6:	{
					system("cls");
					Sys_Init(); 
					if(!queue_empty(q))
						de_queue(q);
				}break;

		}

	}
	/*
	while(!queue_empty(&q)) 
		{
			de_queue(&q, &i);
			printf("%d\n", i);
		}*/
	
	return 0;
}


运行效果图:




  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值