数据结构之队列应用实例

<pre name="code" class="cpp">#include "stdafx.h"
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <time.h>  
typedef struct qnode
{
	int data;
	struct qnode *next;

}QNode;
typedef struct
{
	QNode *front;
	QNode *rear;

}QuType;

//显示时间
void getTime()
{
time_t rawtime;
struct tm * timeinfo;
time ( &rawtime ); 获取时间,以秒计,从1970年1月一日起算,存于rawtime  
timeinfo = localtime ( &rawtime );转为当地时间,tm 时间结构  
//printf ( "时间:%s", asctime (timeinfo) );//转为标准ASCII时间格式:  
 printf("%d-%d-%d %d:%d:%d",timeinfo->tm_year+1900,timeinfo->tm_mon+1,timeinfo->tm_mday,timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec);
}
//主页面显示
void DispWindow()
{
	printf("\n");
	printf("**************************************\n");
	printf("**       病人就诊系统               **\n");
	printf("**                                  **\n");
	printf("**         1--排队                  **\n");
    printf("**         2--就诊                  **\n");
    printf("**         3--查看排队              **\n");
    printf("**         4--取消排队              **\n");
	printf("**         5--下班                  **\n");
    printf("**************************************\n");
	getTime();
	printf("\n");
	printf("  >>");
}
//释放链队
void Destroyqueue(QuType *&qu)
{
   QNode *p, *q;
   p = qu->front;
   if (p != NULL)
   {//若链队不为空,则释放所有节点
	   q = p->next;
	   while (q != NULL)
	   {
	       free(p);
		   p = q;
		   q = q->next;
	   }
	   free(p);
	   p = NULL;
   }
   free(qu);//释放链队节点
   qu = NULL;
}
//清空缓冲区
void clean()
{
	// fflush(stdin);//清除缓冲区内容(不可移植,gcc不支持)
	    char c;
	    while ((c = getchar()) != '\n' && c != EOF);//清除缓冲区内容
}
void seeDoctor()
{
   int sel;//菜单选项
   int flag = 1;
   int find;
   int no;//病例号
   int count = 0;//病人人数
   QuType *qu;
   QNode *p;
   //创建空队列
   qu = (QuType*)malloc(sizeof(QuType));
   if (NULL == qu)
   {
      exit(0);//分配出错则退出
   }
   qu->front = qu->rear = NULL;

   while (flag == 1)
   {
      DispWindow();//显示菜单
      if(1 == (scanf("%d", &sel)))
	  {  	
		  switch (sel)
		  {
		  case 1: printf("  >>输入病例号:");
		          do
				  {
				      if (1 == (scanf("%d", &no)))
					  {
					     find = 0;
						 p = qu->front;
						 //查找病例号
					     while (p != NULL && !find)
						 {
							 if (p->data == no)
							   {
							      find = 1;
							   }else
							   {
								   p = p->next;
							   }
						 }
					     if (find)
						 {
						    printf ("  >>病例号重复,重新输入:");
						    clean();//清空缓冲区
						 }else
						 {
						    count++;//人数增加
						 }
					  }else
					  {
					    printf("  >>输入错误,重新输入!");
					  }
				  }while (1 == find);
		          //创建新节点
				  p = (QNode*)malloc(sizeof(QNode));
		          if (NULL == p)
				  {
				    exit(0);//分配出错,退出			   
				  }
				  p->data = no;
				  p->next = NULL;
				  if (NULL == qu->rear)
				  {
					  qu->front = qu->rear = p;//仅有一个节点
				  }else
				  {  //将*p节点插入到队尾
					  qu->rear->next = p;
					  qu->rear = p;			    
				  }
				  break;
		  case 2: if (NULL == qu->front)
				  {//如果队列为空
				     printf("  >>没有排队的病人!");
				  }else
				  {
					  p = qu->front;
					  printf("  >>病人%d就诊\n", p->data);
					  if (qu->rear == p)
					  {//只有一个病人
						  qu->front = qu->rear = NULL;
					  }else
					  {
						  qu->front = p->next;
						  free(p);
						  p = NULL;
					  }
				  }
				  if (count > 0)
				  {
				     count--;//排队病人减少
				  }else
				  {
				     count = 0;
				  }
				  break;
		  case 3: if (NULL == qu->front)
				  {//如果队列为空
				     printf("  >>没有排列的病人\n");
				  }else
				  {//显示所有排队病人
					  p = qu->front;
					  printf("  >>共有%d个病人在排队\n",count);
					  printf("  >>排队病人:");
					  while (p != NULL)
					  {
						  printf("%d   ", p->data);
						  p = p->next;
						 
					  }
					  printf("\n");
				  }
				  break;
		  case 4:if (NULL == qu->front)
				 {//队为空
				    printf("  >>没有排列的病人\n");
				 }else
				 {
					 p = qu->front;
					 printf("  >>共有%d个病人在排队\n",count);
					 printf("  >>病人按以下顺序就诊:");
				     while (p != NULL)
					 {
						 printf("%d   ", p->data);
						 p = p->next;
						
					 }
					 printf("\n");
				 }
				
				 Destroyqueue(qu);//就诊结束,释放队列
				 flag = 0;
				 break;
		  case 5:if (NULL == qu->front)
				 {//如果队为空
				   printf("  >>请排队的病人明天就医\n");
				 }
				 flag = 0;				 
				 Destroyqueue(qu);
				 break;
		  default : printf("  >>输入错误!\n");break;
		  }//switch语句结束
	  	  
	  }else
	  {
	    printf("  >>输入错误!\n"); 
	  }
	  clean();//清空缓冲区
   }//总循环结束
}

int main()
{
   seeDoctor();
   return 0;
}

 
 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值