• 链队列的C++实现


    #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);
    }

  • 相关阅读:
    位运算技巧2
    如果函数的参数是一个指针,不要指望用该指针去申请动态内存
    位运算 技巧1
    野指针?空指针?
    面试题:位操作实现四则运算
    面试题:递归颠倒栈 与栈排序
    求一个数任意位的值及位数
    基数排序
    面试题:最长回文子串(即求对称字符串的最大长度 )
    数据结构之后缀数组suffix array
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7338770.html
Copyright © 2020-2023  润新知