#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++实现
时间: 2024-10-26 06:23:37