队列的链队表示和实现

一、链队的存储结构

 

//队列的链式存储结构
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);


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值