队列之链队列

 目录

一、带头结点的链队列

1.定义

 2.初始化

3.判空

4.入队

5.出队

6.获取队头元素

二、不带头结点的链队列

1.定义

 2.初始化

3.判空

4.入队

5.出队

6.获取队头元素

三、具体代码和运行结果


详细的关于队列的概念参见上一篇《队列之循环队列》,本文介绍的是带头结点的链队列

一、带头结点的链队列

1.定义

typedef struct LinkNode {

      ElemType data;

      struct LinkNode *next;

}LinkNode;

typedef struct {

      LinkNode *front,*rear;

}LinkQueue; 

 2.初始化

让队头队尾指针都指向头结点 ,next指针指向空

void InitQueue ( LinkQueue &Q) {

        Q.front = Q.rear = (LinkNode*) malloc (sizeof(LinkNode)); //队头队尾指针都指向头结点

        Q.front->next = NULL;

}

3.判空

 bool QueueEmpty(LinkQueue &Q) {

         if (Q.front == Q.rear)

   /*   if (Q.front->next  == NULL)  */

            return true;

         else

            return false;

}

4.入队

 void EnQueue (LinkQueue &Q, ElemType x) {

        LinkNode *s = (LinkNode*) malloc (sizeof(LinkNode));

        s->data = x;

        s->next = NULL;

        Q.rear->next = s;  //插入结点s

       Q.rear = s;  //修改表尾指针

}

5.出队

 bool DeQueue (LinkQueue &Q, ElenType &x) {

         if (Q.front == Q.rear) //判空

             return false;

         LinkNode *p = Q.front->next;  //p为头结点的后一个结点

         x = p->data;

        Q.front->next = p->next;

        if (Q.rear == p)  //队列中只有一个元素

                Q.rear = Q.front;

        free(p);

        return true;

}

6.获取队头元素

 int GetHead(LinkQueue Q) {

        if (Q.front == Q.rear) //判空

             return -1;

         LinkNode *p = Q.front->next;  //p为头结点的后一个结点

         return p->data;   

}

二、不带头结点的链队列

1.定义

typedef struct LinkNode {

      ElemType data;

      struct LinkNode *next;

}LinkNode;

typedef struct {

      LinkNode *front,*rear;

}LinkQueue; 

 2.初始化

让队头队尾指针都指向空

void InitQueue ( LinkQueue &Q) {

        Q.front = Q.rear = NULL;

}

3.判空

 bool QueueEmpty(LinkQueue &Q) {

         if (Q.front == NULL)  

            return true;

         else

            return false;

}

4.入队

 void EnQueue (LinkQueue &Q, ElemType x) {

        LinkNode *s = (LinkNode*) malloc (sizeof(LinkNode));

        s->data = x;

        s->next = NULL;

        if (Q.front  == NULL) {  //插入第一个元素

                Q.front = s;

                Q.rear = s;

        }

        else {

               Q.rear->next = s;  //插入结点s

               Q.rear = s;  //修改表尾指针

        }

}

5.出队

bool DeQueue (LinkQueue &Q, ElenType &x) {

         if (Q.front == NULL) //判空

              return false;

         LinkNode *p = Q.front;  //p为第一个结点

         x = p->data;

         Q.front = p->next;

         if (Q.rear == p) { //队列中只有一个元素

                Q.rear = NULL;

                Q.rear = NULL;

         }

         free(p);

         return true;

}

6.获取队头元素

 int GetHead(LinkQueue Q) {

        if (Q.front == Q.rear) //判空

             return -1;

         return Q.front->data;   

}

三、具体代码和运行结果

以带头结点为例

typedef struct LinkNode //结点定义
{
    int data;
    struct LinkNode *next;
}LinkNode;

typedef struct  //链队列定义
{
    LinkNode *front,*rear;
}LinkQueue;

//初始化
void InitQueue(LinkQueue &Q)
{
    Q.front = Q.rear = (LinkNode *)malloc(sizeof(LinkNode));
    Q.front->next = NULL;

}

//入队
void EnQueue(LinkQueue &Q, int x)
{
    LinkNode *p = (LinkNode *)malloc(sizeof(LinkNode));
    p->data = x;
    p->next = NULL;
    Q.rear->next = p;
    Q.rear = p;
}

//出队
int DeQueue(LinkQueue &Q)
{
    int x;
    if (Q.front == Q.rear)
    {
        cout << "队空" <<endl;
        return -1;
    }
    LinkNode *p = Q.front->next;
    x = p->data;
    Q.front->next = p->next;
    if(Q.rear == p)
        Q.rear = Q.front;
    free(p);
    return x;
}

//判空
bool QueueEmpty(LinkQueue Q)
{
    if (Q.front == Q.rear)
        return true;
    else
        return false;
}

//获取队头元素
int GetHead(LinkQueue Q)
{
    if (Q.front == Q.rear)
    {
        cout << "队空" <<endl;
        return -1;
    }
    LinkNode *p = Q.front->next;
    return p->data;
}

//打印
void PrintQueue(LinkQueue Q)
{
    LinkNode *p;
    p = Q.front->next;
    while (p != NULL)
    {
        cout << p->data <<" ";
        p = p->next;
    }
}

int main()
{
    LinkQueue Q;
    InitQueue(Q);

    cout << "=============================="<<endl;
    cout << ".......输入1进行入队操作......"<<endl;
    cout << ".......输入2进行出队操作......"<<endl;
    cout << ".......输入3进行打印操作......"<<endl;
    cout << "..输入4进行获取队头元素操作..."<<endl;
    cout << ".......输入5进行判空操作......"<<endl;
    cout << ".......输入0退出程序......"<<endl;
    cout << "=============================="<<endl;
    cout <<endl;

    int n;
    while (1)
    {
        cout << "请输入要执行的操作:";
        cin >> n;
        switch(n)
        {
        case 1:
            cout << "此时进行入队操作:..."<<endl;
            EnQueue(Q,1);
            EnQueue(Q,2);
            EnQueue(Q,3);
            EnQueue(Q,4);
            EnQueue(Q,5);
            cout << "入队操作结束,请执行后续操作..."<<endl;
            break;
        case 2:
            cout << "此时进行出队操作:..."<<endl;
            DeQueue(Q);
            cout << "出队操作结束,请执行后续操作..."<<endl;
            break;
        case 3:
            cout << "正在打印上述操作结果:..."<<endl;
            cout << "此时队列内容为:";
            PrintQueue(Q);
            cout<<endl;
            cout << "打印操作结束,请执行后续操作..."<<endl;
            break;
        case 4:
            cout<<"此时的队头元素为:"<<GetHead(Q)<<endl;
            cout << "获取队头元素操作结束,请执行后续操作..."<<endl;
            break;
        case 5:
            cout<<"此时进行判空操作..."<<endl;
            cout << "判空结果为:";
            if(!QueueEmpty(Q))
            {
                cout<<"队不为空"<<endl;
            }
            break;
        case 0:
            cout<<"已退出程序"<<endl;
            exit(0);
        }
    }

    return 0;
}

运行结果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值