利用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