一、链队的存储结构
//队列的链式存储结构
typedef int QElemType;
typedef struct QNode
{
QElemType data;
struct QNode *next;
} QNode,*QueuePtr;
typedef struct
{
QueuePtr front;//队头指针
QueuePtr rear;//队尾指针
} LinkQueue;
二、链队的初始化
算法步骤:
(1)生成新的结点作为头结点,队头队尾指针指向此结点。
(2)头结点的指针域置空。
//链队的初始化
void InitQueue(LinkQueue &Q)
{
//构造一个空队列
Q.front=Q.rear= new QNode;//生成新的结点作为头结点,队头和队尾指向此结点
Q.front->next=NULL;//头结点的指针域置空
cout<<"链队构造成功!"<<endl;
}
三、链队的入队
算法步骤:
(1)为入队元素分配结点空间,用p指针指向。
(2)将新结点数据域置为e。
(3)将新结点插入到队尾。
(4)修改队尾指针为p。
//链队的入队
void EnQueue(LinkQueue &Q,QElemType e)
{
//插入元素e尾Q的新的队尾元素
QNode *p=new QNode;//为入队的元素分配结点kjian,用指针P指向
p->data=e;//将结点的数据域置为e
p->next=NULL;//将p的指针域置空
Q.rear->next=p;//将新结点插入到队尾,也就是把新结点的地址给队尾的next域
Q.rear=p;//修改队尾指针,新结点为队尾
cout<<"入队成功!"<<endl;
}
四、链队的出队
算法步骤:
(1)判断队列是否为空,
(2)临时保存队头元素的空间,以备释放。
(3)修改头结点的指针域,指向下一结点。
(4)判断出队元素是否为最后一个元素,若是,则将队尾指针重新赋值,指向头结点。
(5)释放队头元素空间。
//链队的出队
int DeQueue(LinkQueue &Q,QElemType &e)
{
//删除Q的队头元素,用e返回其值
if(Q.front==Q.rear)
{
cout<<"出队失败,队空!"<<endl;
return 0;
}
QueuePtr p=Q.front->next;//p指向队头元素
e=p->data;//e保存队头元素的值
Q.front->next=p->next;//修改头结点的指针域
if(Q.front==p)//最后一个元素被删,队尾指针指向头结点
{
Q.rear=Q.front;
}
delete p;//释放队头元素的空间
cout<<"出队成功!"<<endl;
return e;
}
五、取链队的队头元素
//取队头元素
int GetHead(LinkQueue Q)
{
//返回Q的队头元素,不修改头指针
if(Q.front!=Q.rear)
{
return Q.front->next->data;
}
else
{
cout<<"获取头元素失败,队空!"<<endl;
}
}
六、输入、输出
void InPutQueue(LinkQueue &Q)
{
cout<<"希望入队几个元素:";
int n,e;
cin>>n;
for(int i=1; i<=n; i++)
{
cout<<"请输入第"<<i<<"个元素:";
cin>>e;
EnQueue(Q,e);
}
}
void OutPutQueue(LinkQueue &Q){
QueuePtr p=Q.front->next;//p指向队头元素
cout<<"- - 队头 - -"<<endl;
while(p!=NULL){
cout<<p->data<<endl;
p=p->next;
}
cout<<"- - 队尾 - -"<<endl;
}
七、完整代码
#include <iostream>
using namespace std;
//队列的链式存储结构
typedef int QElemType;
typedef struct QNode
{
QElemType data;
struct QNode *next;
} QNode,*QueuePtr;
typedef struct
{
QueuePtr front;//队头指针
QueuePtr rear;//队尾指针
} LinkQueue;
//链队的初始化
void InitQueue(LinkQueue &Q)
{
//构造一个空队列
Q.front=Q.rear= new QNode;//生成新的结点作为头结点,队头和队尾指向此结点
Q.front->next=NULL;//头结点的指针域置空
cout<<"链队构造成功!"<<endl;
}
//链队的入队
void EnQueue(LinkQueue &Q,QElemType e)
{
//插入元素e尾Q的新的队尾元素
QNode *p=new QNode;//为入队的元素分配结点kjian,用指针P指向
p->data=e;//将结点的数据域置为e
p->next=NULL;//将p的指针域置空
Q.rear->next=p;//将新结点插入到队尾,也就是把新结点的地址给队尾的next域
Q.rear=p;//修改队尾指针,新结点为队尾
cout<<"入队成功!"<<endl;
}
//链队的出队
int DeQueue(LinkQueue &Q,QElemType &e)
{
//删除Q的队头元素,用e返回其值
if(Q.front==Q.rear)
{
cout<<"出队失败,队空!"<<endl;
return 0;
}
QueuePtr p=Q.front->next;//p指向队头元素
e=p->data;//e保存队头元素的值
Q.front->next=p->next;//修改头结点的指针域
if(Q.front==p)//最后一个元素被删,队尾指针指向头结点
{
Q.rear=Q.front;
}
delete p;//释放队头元素的空间
cout<<"出队成功!"<<endl;
return e;
}
//取队头元素
int GetHead(LinkQueue Q)
{
//返回Q的队头元素,不修改头指针
if(Q.front!=Q.rear)
{
return Q.front->next->data;
}
else
{
cout<<"获取头元素失败,队空!"<<endl;
}
}
void InPutQueue(LinkQueue &Q)
{
cout<<"希望入队几个元素:";
int n,e;
cin>>n;
for(int i=1; i<=n; i++)
{
cout<<"请输入第"<<i<<"个元素:";
cin>>e;
EnQueue(Q,e);
}
}
void OutPutQueue(LinkQueue &Q)
{
QueuePtr p=Q.front->next;//p指向队头元素
cout<<"- - 队头 - -"<<endl;
while(p!=NULL)
{
cout<<p->data<<endl;
p=p->next;
}
cout<<"- - 队尾 - -"<<endl;
}
int main()
{
LinkQueue Q;
InitQueue(Q);
InPutQueue(Q);
OutPutQueue(Q);
//出队
int a;
int ou= DeQueue(Q,a);
cout<<ou<<endl;
int head=GetHead(Q);
cout<<"头元素是:"<<head<<endl;
OutPutQueue(Q);
}