首页 > 编程语言 > 详细

链队列的C++实现

时间:2014-05-08 03:48:50      阅读:417      评论:0      收藏:0      [点我收藏+]
#include<iostream>
using namespace std;
//节点类
template<class T>
struct QNode
{
	T data;
	QNode *next;
};
//队列类
template<class T>
struct LinkList
{
	QNode<T> * front;
	QNode<T> * rear;
	size_t size;
};

//构造一个空队列
template<class T>
void InitQueue(LinkList<T> & que)
{
	que.front = (QNode<T> *)malloc(sizeof(QNode<T>));
	if(!que.front) exit(0);
	que.size = 0;
	que.rear = que.front;
	que.rear->next = 0;
}
//销毁队列
template<class T>
void DestroyQueue(LinkList<T>& que)
{
	QNode<T> * p = que.front->next;
	free(que.front);
	while(p != 0)
	{
		que.front = p->next;
		free(p);
		p = que.front;
	}
}
//清空队列
template<class T>
void ClearQueue(LinkList<T>& que)
{
	QNode<T> * p = que.front->next;
	while(p != 0)
	{
		que.rear = p->next;
		free(p);
		p = que.rear;
	}
	que.rear = que.front;
	que.front->next = 0;
	que.size = 0;
}
//返回队列的长度
template<class T>
int QueueLength(LinkList<T>& que)
{
	return que.size;
}
//返回队列的队首元素
template<class T>
T GetHead(LinkList<T>& que)
{
	return que.front->next->data;
}
//元素入队
template<class T>
void EnQueue(LinkList<T>& que,T t)
{
	QNode<T> *p = (QNode<T>*)malloc(sizeof(QNode<T>));
	if(!p) exit(0);
	p->data = t;
	p->next = 0;
	que.rear->next = p;
	que.rear = p;
	que.size++;
}
//元素出队
template<class T>
bool DeQueue(LinkList<T>& que,T & t)
{
	if(que.size==0)
		return false;
	QNode<T> *p = que.front->next;
	que.front->next = p->next;
	que.size--;
	t = p->data;
	free(p);
	return true;
}
//从对头到队尾元素遍历调用visit函数
template<class T>
void VisitQueue(LinkList<T>& que,void (*visit)(T &t))
{
	QNode<T> *p = que.front->next;
	while(p != 0)
	{
		(*visit)(p->data);
		p = p->next;
	}
}
//测试函数
template<class T>
void Print(T &t)
{
	cout<<t<<endl;
}
template<class T>
void AddOne(T &t)
{
	t++;
}

int main()
{
//创建一个空的队列
	LinkList<int> queue;
//初始化队列
	InitQueue(queue);
//元素入队
	EnQueue(queue,1);
	EnQueue(queue,2);
	EnQueue(queue,3);
	EnQueue(queue,4);
//返回队列的长度
	cout<<"队列的长度:  "<<QueueLength(queue)<<endl;
//输出所有元素
	VisitQueue(queue,Print<int>);

//返回队列的队首元素
	cout<<"队列的队首元素:  "<<GetHead(queue)<<endl;
//元素出队
	int a ;
	if(DeQueue(queue,a))
	{
	  cout<<"出队元素:  "<<a<<endl;
	}
//返回队列的长度
	cout<<"队列的长度:  "<<QueueLength(queue)<<endl;
//输出所有元素
	VisitQueue(queue,Print<int>);
//元素出队
	if(DeQueue(queue,a))
	{
	  cout<<"出队元素:  "<<a<<endl;
	}
//返回队列的长度
	cout<<"队列的长度:  "<<QueueLength(queue)<<endl;
//输出所有元素
	VisitQueue(queue,Print<int>);

//将所有元素加一
	cout<<"将所有元素加一"<<endl;
	VisitQueue(queue,AddOne<int>);
//输出所有元素
	VisitQueue(queue,Print<int>);

//清空队列
	ClearQueue(queue);
//销毁队列
	DestroyQueue(queue);
}
bubuko.com,布布扣

链队列的C++实现,布布扣,bubuko.com

链队列的C++实现

原文:http://blog.csdn.net/yyc1023/article/details/25252207

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!