您的位置:首页 > 理论基础 > 数据结构算法

数据结构之队列应用实例

2014-10-15 21:01 381 查看
<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;
}




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