队列学习笔记 银行排号程序

 //循环队列
 //CycQueue.h
#define QUEUEMAX 15
typedef struct 
{
	DATA data[QUEUEMAX];  //队列数组 
	int head; //队头 
	int tail; //队尾 
}CycQueue;
CycQueue *CycQueueInit ()
{
	CycQueue *q;
	if(q=(CycQueue *)malloc(sizeof(CycQueue))) //申请保存队列的内存 
	{
		q->head = 0;  //设置队头 
		q->tail = 0; //设置队尾 
		return q;
	}else
		return NULL; // 返回空 
}
void CycQueueFree(CycQueue *q)  // 释放队列 
{
	if(q!=NULL)
		free(q);
}
int CycQueueIsEmpty(CycQueue *q)  // 队列是否为空 
{  
	return  (q->head==q->tail) ;
}
int CycQueueIsFull (CycQueue *q) // 队列是否已满 
{
	return ((q->tail+1)%QUEUEMAX == q->head) ;
}
int CycQueueIn(CycQueue *q,DATA data)  // 入队函数
{
	if((q->tail+1)%QUEUEMAX == q->head)
	{
		printf("队列已满!\n");
		return 0;
	}else{
		q->tail = (q->tail+1)%QUEUEMAX; //求列尾序号 
		q->data[q->tail]  = data;
		return 1;
	}
 } 
DATA *CycQueueOut (CycQueue *q) // 循环队列的出队函数 
{
	if(q->head == q->tail)
	{
		printf("队列已空!\n");
		return NULL; 
	}else{
		q->head=(q->head+1)%QUEUEMAX;
		return &(q->data[q->head]);
	} 
 } 
 int CycQueueLen(CycQueue *q)  // 获取队列长度 
 {
 	int n;
 	n=q->tail-q->head;
 	if(n<0)
 		n=QUEUEMAX + n;
 	return n;
  } 
DATA *CycQueuePeek(CycQueue *q) // 获取队列中第1个位置的数据 
{
	if(q->head==q->tail)
	{
		printf("队列已经为空!\n");
		return NULL;
	}else{
		return &(q->data[(q->head+1)%QUEUEMAX]);
	}
}
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef struct
{
	int num;  // 顾客编号 
	long time ; //进入队列时间 
}DATA ;
#include "CycQueue.h"
int num;  //顾客序号 
void add(CycQueue *q  )  //新增顾客排列 
{
	DATA data;
	if(!CycQueueIsFull(q)) //如果队列未满 
	{
		data.num=++num;
		data.time=time(NULL);
		CycQueueIn(q,data);
	}
	else
		printf("\n排队的人太多,请稍候再排队!\n");
}
void next(CycQueue *q) // 通知下一顾客准备
{
	DATA *data;
	if(!CycQueueIsEmpty(q))  // 若队列不为空 
	{
		data = CycQueueOut(q); //取队列头部的数据 
		printf("\n请编号为%d的顾客办理业务!\n",data->num);
	}
	if(!CycQueueIsEmpty(q))  //若队列不为空 
	{
		data = CycQueuePeek(q); //取队列中指定位置的数据 
		printf("请编号为%d的顾客准备,马上将为您办理业务!\n",data->num);
	}
}
int main()
{
	CycQueue *queue1;
	int i,n;
	char select;
	num = 0;  //顾客序号 
	queue1=CycQueueInit(); // 初始化队列
	if(queue1==NULL) 
	{
		printf("创建队列出错!\n");
		getch();
		return 0;
	}
	do{
		printf("\n 请选择具体操作:\n");
		printf("1.新到顾客\n");
		printf("2.下一个顾客\n");
		printf("0.退出\n");
		fflush(stdin);
		select=getch();
		switch(select)
		{
			case ‘1‘:
				add(queue1);
				printf("\n 现在共有%d位顾客在等候!\n",CycQueueLen(queue1));
				break;
			case ‘2‘:
				next(queue1);
				printf("\n现在共有%d位顾客在等候!\n",CycQueueLen(queue1));
				break;
			case ‘0‘:
				break;
		}
	}while(select != ‘0‘);
	CycQueueFree(queue1); // 释放队列
	getch() ;
	return 0;
 }
时间: 2024-10-01 22:08:13

队列学习笔记 银行排号程序的相关文章

Linux 程序设计学习笔记----进程管理与程序开发(下)

转载请注明出处:http://blog.csdn.net/suool/article/details/38419983,谢谢! 进程管理及其控制 创建进程 fork()函数 函数说明具体参见:http://pubs.opengroup.org/onlinepubs/009695399/functions/fork.html 返回值:Upon successful completion, fork() shall return 0 to the child process and shall re

Linux 程序设计学习笔记----进程管理与程序开发(上)

转载请注明出处,http://blog.csdn.net/suool/article/details/38406211,谢谢! Linux进程存储结构和进程结构 可执行文件结构 如下图: 可以看出,此ELF可执行文件存储时(没有调入内存)分为代码区.数据区和未出花数据区三部分. 代码区:存放cpu的执行的机器指令. 数据区:包含程序中的已经初始化的静态变量,以及已经初始化的全局变量. 未初始化数据区:存入的是未初始化的全局变量和未初始化的静态变量. 现在在上面的程序代码中增加一个int的静态变量

C++ Primer 学习笔记_89_用于大型程序的工具 --异常处理[续2]

用于大型程序的工具 --异常处理[续2] 八.自动资源释放 考虑下面函数: void f() { vector<string> v; string s; while (cin >> s) { v.push_back(s); } string *p = new string[v.size()]; //... delete p; } 在正常情况下,数组和vector都在退出函数之前被撤销,函数中最后一个语句释放数组,在函数结束时自动撤销vector. 但是,如果在函数内部发生异常,则将

C++ Primer 学习笔记_90_用于大型程序的工具 --异常处理[续3]

用于大型程序的工具 --异常处理[续3] 九.auto_ptr类[接上] 5.auto_ptr对象的复制和赋值是破坏性操作 auto_ptr和内置指针对待复制和赋值有非常关键的区别.当复制auto_ptr对象或者将它的值赋给其他auto_ptr对象的时候,将基础对象的所有权从原来的auto_ptr对象转给副本,原来的auto_ptr对象重置为未绑定状态. auto_ptr<string> strPtr1(new string("HELLO!")); auto_ptr<

C++ Primer 学习笔记_93_用于大型程序的工具 --命名空间[续2]

用于大型程序的工具 --命名空间[续2] 五.类.命名空间和作用域 名字的可见性穿过任意嵌套作用域,直到引入名字的块的末尾. 对命名空间内部使用的名字的查找遵循常规C++查找规则:当查找名字的时候,通过外围作用域外查找.对命名空间内部使用的名字而言,外围作用域可能是一个或多个嵌套的命名空间,最终以全包围的全局命名空间结束.只考虑已经在使用点之前声明的名字,而该使用仍在开放的块中: namespace A { int i; namespace B { int i; int j; int f1()

C++ Primer 学习笔记_94_用于大型程序的工具 --命名空间[续3]

用于大型程序的工具 --命名空间[续3] 六.重载与命名空间 正如我们所见,每个命名空间维持自己的作用域,因此,作为两个不同命名空间的成员的函数不能互相重载.但是,给定命名空间可以包含一组重载函数成员. 1.候选函数与命名空间 命名空间对函数匹配有两个影响.一个影响是明显的:using声明或using 指示可以将函数加到候选集合.另一个影响则微妙得多. 正如前节所见,有一个或多个类类型形参的函数的名字查找包括定义每个形参类型的命名空间.这个规则还影响怎样确定候选集合,为找候选函数而查找定义形参类

C++ Primer 学习笔记_95_用于大型程序的工具 --多重继承与虚继承

用于大型程序的工具 --多重继承与虚继承 引言: 大多数应用程序使用单个基类的公用继承,但是,在某些情况下,单继承是不够用的,因为可能无法为问题域建模,或者会对模型带来不必要的复杂性. 在这些情况下,多重继承可以更直接地为应用程序建模.多重继承是从多于一个直接基类派生类的能力,多重继承的派生类继承其所有父类的属性. 一.多重继承 1.定义多个类 为了支持多重继承,扩充派生列表: class Bear : public ZooAnimal { //... }; 以支持由逗号分隔的基类列表: cla

C++ Primer 学习笔记_96_用于大型程序的工具 --多重继承与虚继承[续1]

用于大型程序的工具 --多重继承与虚继承[续1] 四.多重继承下的类作用域 成员函数中使用的名字和查找首先在函数本身进行,如果不能在本地找到名字,就继续在本类中查找,然后依次查找每个基类.在多重继承下,查找同时检察所有的基类继承子树 -- 在我们的例子中,并行查找 Endangered子树和Bear/ZooAnimal子树.如果在多个子树中找到该名字,则那个名字的使用必须显式指定使用哪个基类;否则,该名字的使用是二义性的. [小心地雷] 当一个类有多个基类的时候,通过对所有直接基类同时进行名字查

【学习笔记】DirectX应用程序如何初始化

一.使用Windows API创建一个窗口 二.创建一个Swap Chain(交换链) 这一步需要用到一个名为DXGI_SWAP_CHAIN_DESC的结构体,其详细定义如下: typedef struct DXGI_SWAP_CHAIN_DESC { DXGI_MODE_DESC BufferDesc; DXGI_SAMPLE_DESC SampleDesc; DXGI_USAGE BufferUsage; UINT BufferCount; HWND OutputWindow; BOOL W