利用C++实现队列的表示和操作,插入、删除、遍历等(链式表示)-创新互联

一、创建linkqueue.h头文件,定义队列并声明函数

10年积累的成都网站建设、网站建设经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站制作后付款的网站建设流程,更有永安免费网站建设让你可以放心的选择与我们合作。
#pragma once
#includeusing namespace std;

//定义
struct QNode
{
	int data; //数据域
	QNode* next; //指针域
};

typedef QNode* QueuePtr;//将QueuePtr定义为QNode*类型

struct LinkQueue
{
	QueuePtr front; //队头指针
	QueuePtr rear; //队尾指针
};

//初始化
bool InitQueue(LinkQueue& Q);

//插入
bool InsertQueue(LinkQueue& Q, int e);

//删除
bool DeQueue(LinkQueue& Q,int &e);

//遍历
void PrintQueue(LinkQueue Q);

//判断队列是否为空
bool QueueEmpty(LinkQueue Q);

//队列长度
int QueueLength(LinkQueue Q);

//清空
bool ClearQueue(LinkQueue& Q);

//销毁
bool DestoryQueue(LinkQueue& Q);

二、创建linkqueue.cpp源文件,将声明的函数做具体实现

#include"linkqueue.h"

//初始化
bool InitQueue(LinkQueue& Q)
{
	Q.front = Q.rear = new QNode; //头指针尾指针指向头结点
	if (!Q.front) //分配失败退出
	{
		exit(0);
	}
	Q.front->next = NULL; //头结点指针域置为空
	return true;
}

//插入
bool InsertQueue(LinkQueue& Q, int e)
{
	QueuePtr p = new QNode; //生产新结点
	if (!p) //分配失败
	{
		return false;
	}
	p->data = e; //将e的值赋给新结点的指针域
	p->next = NULL; //新结点数据域为空
	Q.rear->next = p; //尾指针的指针域指向新结点
	Q.rear = p; //新结点赋给尾指针
	return true;
}

//删除
bool DeQueue(LinkQueue& Q, int& e)
{
	if (Q.front == Q.rear) //判断队列是否为空
	{
		return false;
	}

	QueuePtr p = Q.front->next; //将首元结点地址赋给p
	e = p->data; //首元结点数据域赋值给e
	Q.front->next = p->next; //头结点的数据域指向首元结点的下一结点
	
	//判断尾指针是否指向首元结点,是则将头指针赋值给尾指针,表为空
	if (Q.rear == p) 
	{
		Q.rear = Q.front; 
	}
	delete p; //是否p
	return true;
}

//遍历
void PrintQueue(LinkQueue Q)
{
	QueuePtr p = Q.front->next;
	while (p)
	{
		cout<< p->data<< endl;
		p = p->next;
	}
}

//判断队列是否为空
bool QueueEmpty(LinkQueue Q)
{
	if (Q.front == Q.rear)
	{
		return true;
	}
	else
	{
		return false;
	}
}

//队列长度
int QueueLength(LinkQueue Q)
{
	QueuePtr p = Q.front->next;
	int count = 0;
	while (p)
	{
		count++;
		p = p->next;
	}
	return count;
}

//清空
bool ClearQueue(LinkQueue& Q)
{
	QueuePtr p = Q.front->next;
	while (p)
	{
		QueuePtr q = p->next;
		delete p;
		p = q;
	}
	Q.front->next = NULL;
	Q.rear = Q.front;
	return true;
}

//销毁
bool DestoryQueue(LinkQueue& Q)
{
	while (Q.front) //头指针不为空
	{
		//销毁时尾指针空闲,可利用尾指针保存下一结点
		Q.rear = Q.front->next; 
		delete Q.front; //释放头指针
		Q.front = Q.rear; //将下一结点重新赋值给头结点
	}
	return true;
}

三、在主函数中测试

#includeusing namespace std;
#include"linkqueue.h" //包含头文件

int main()
{
	//1.创建队列Q,并初始化
	LinkQueue Q;
	InitQueue(Q);

	//2.插入
	int arr[5] = { 1,2,3,4,5 };
	for (int i = 0; i< 5; i++)
	{
		InsertQueue(Q, arr[i]);
	}
	cout<< "插入后元素为:"<< endl;
	//3.遍历
	PrintQueue(Q);

	//4.删除
	int e;
	DeQueue(Q, e);
	cout<< "元素"<< e<< "已删除"<< endl;
	cout<< "删除后打印:"<< endl;
	PrintQueue(Q);

	//5.判断队列是否为空
	if (QueueEmpty(Q))
	{
		cout<< "队列为空"<< endl;
	}
	else
	{
		//6.队列长度
		cout<< "队列不为空,队列长为:"<< QueueLength(Q)<< endl;
	}

	//7.清空
	ClearQueue(Q);
	cout<< "清空后打印:"<< endl;
	PrintQueue(Q);

	//8.销毁
	DestoryQueue(Q);


	system("pause");
	return 0;
}

四、最终结果

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


文章名称:利用C++实现队列的表示和操作,插入、删除、遍历等(链式表示)-创新互联
URL地址:http://ybzwz.com/article/ecdop.html