前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >链式队列---c++版本

链式队列---c++版本

作者头像
大忽悠爱学习
发布2021-03-11 11:10:16
3350
发布2021-03-11 11:10:16
举报
文章被收录于专栏:c++与qt学习

尾插头删

在这里插入图片描述
在这里插入图片描述

因此这里选择有头节点的链式队列

在这里插入图片描述
在这里插入图片描述

注意:在进行删除元素的过程中,当进行到最后一个节点的删除时,要将rear指回头结点,不然rear为也指针

因为删除完最后一个有效节点时,rear为野指针,并且按理rear应该指向队列的尾部,此时队列头尾重合,所以要把rear指向头结点

在这里插入图片描述
在这里插入图片描述

main.cpp

代码语言:javascript
复制
#include<iostream>
using namespace std;
#include"s.hpp"
//测试代码------------------------
void test()
{
	linkQueue<int> q;
	q.enlinkQueue(1);
	q.enlinkQueue(2);
	q.enlinkQueue(3);
	cout << q.queueLen() << endl;
	while (!q.isEmpty())
	{
		int temp = q.getTop();
		cout << temp << endl;
		q.delinkQueue();
	}
	q.clear();
	cout << q.queueLen() << endl;
}
int main()
{

	test();
	system("pause");
	return 0;
}

linkQueue.hpp

代码语言:javascript
复制
#include<iostream>
using namespace std;
//节点结构体
template<class T>
struct node 
{
    T data;
    node* next;
};
//队列类
template<class T>
class linkQueue {
private:
    node<T>* front, *rear;//指向队列头结点,指向队列尾节点
    int length;  //元素个数
public:
    //这里只需要默认无参构造,不需要有参构造
    linkQueue() 
    {
        //在堆区创建一个头结点
        front = rear = new node<T>;
        front->next = NULL;
        length = 0;
    }
    ~linkQueue()//释放队列空间
    {
        //头结点为空,就不进行释放
        if (front == NULL)
        {
            return;
        }
        //如果不为空,就先释放除了子节点,再释放头节点
        for (int i = 0; i < length; i++)
        {
            //把每一个开辟在堆区的节点都进行释放,包括头节点
            //相当于销毁链表
           //用一个临时节点保存下一个要删除的节点
            node<T>* temp;
            temp = front;
            front = front->next;
            free(temp);
        }
    }
    //入队---尾插
    void enlinkQueue(T val)
    {
        //不用判断队列是否为满,因为是链式存储
        //头插
        node<T>* s = new node<T>;
        s->data = val;
        s->next = NULL;

        rear->next = s;
        rear = s;
        length++;

    }
    //出队---头删
    bool delinkQueue()
    {
        //队列为空,返回假
        if (front == rear)
        {
            return false;
        }
        //进行头删
        //提前保存下一个要删除的节点
        node<T>* temp = front->next;
        front->next = temp->next;
        //判断删除的是否是最后一个节点,是的话把rear指向头结点
        if (temp == rear)
        {
            rear = front;
        }
        free(temp);
        length--;
        return true;
    }
    //获取队头元素
        T getTop()
    {
        return front->next->data;
    }
    //清空队列
    void clear()
    {
        //清空除头结点以外的节点
        node<T>* workNode;
        workNode = front->next;
        while (workNode)
        {
            //保存下一个要删除的节点
            node<T>* nextNode = workNode;
            workNode = workNode->next;
            free(nextNode);
        }
        workNode = NULL;
        //尾指针更新到头指针处
        front->next = NULL;
        rear = front;
        length = 0;
    }
    int queueLen()
    {
        return length;
    }
    bool isEmpty()
    {
        if (length == 0)
            return true;
        return false;
    }
};
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/03/09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 尾插头删
  • 因此这里选择有头节点的链式队列
  • 注意:在进行删除元素的过程中,当进行到最后一个节点的删除时,要将rear指回头结点,不然rear为也指针
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档