链队列的C++实现
2017-08-10 13:20
344 查看
#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); }
相关文章推荐
- 【C++】实现循环队列
- 泛型队列实现文件C++
- c++ 简单实现优先级队列
- 【C++】队列的实现
- 【数据结构】实现大小堆也叫二叉堆(类似c++中的优先队列)
- C++实现普通队列,循环队列的基本操作(初始化,入队,出队,获取队列首元素等)
- 螺旋队列C++代码实现实例及运行结果
- C++ 队列(queue)堆栈(stack)实现基础
- 数据结构队列C++代码实现
- C++:用两个栈来实现一个队列,完成队列的Push和Pop操作
- C++实现的链表队列
- C++ 栈实现队列
- c++ 实现队列
- 剑指offer两个栈实现队列的c++写法(九度1512)
- c++ queue 顺序队列的实现
- 栈和队列及其C++实现(一)
- C++两个队列实现栈
- 数组实现队列功能(C++练习记录)
- 【C++】模板实现双链表和队列
- 用两个栈实现队列 C++实现