队列的实现

简介:
利用单链表实现一个队列,
基本操作:初始化,入队列,出队列,判断队列是否为空,返回队首数据,返回队列数据个数。


1.Queue.h

#pragma once

#include <assert.h>
#include <String.h>
#include <stdlib.h>

// 利用单链表实现队列

typedef int QDataType;

// 队列结点定义
typedef struct QNode {
    QDataType data;     // 结点数据
    struct QNode *pNext;    //下一结点地址
}   QNode;

// 队列链表的定义
typedef struct Queue {
    QNode *pFront;  //队头 :进行删除
    QNode *pRear;   //队尾 :进行插入
    int size;       //结点个数,即队列大小
}   Queue;


// 队列初始化
void QueueInit(Queue *pQ) 
{
    assert(pQ != NULL);
    pQ->pFront = pQ->pRear = NULL;
    pQ->size = 0;
}

// 入队 : 从队尾插入一个元素
void  QueuePush(Queue *pQ, QDataType data) 
{
    assert(pQ != NULL);

    pQ->size++;
    QNode *pNewNode = (QNode *)malloc(sizeof(QNode));
    assert(pNewNode);
    pNewNode->data = data;
    pNewNode->pNext = NULL;

    // 若队列为空
    if (pQ->pRear == NULL) {
        pQ->pFront = pQ->pRear = pNewNode;
        return;
    }

    // 通常情况,即队列不为空,至少有一个结点
    pQ->pRear->pNext = pNewNode;
    pQ->pRear = pNewNode;

}

// 出队 :从队头删除一个元素
void QueuePop(Queue *pQ)
{
    assert(pQ != NULL);
    assert(pQ->size > 0); // 必须判断队列是否为空
    pQ->size--;

    // 通常情况
    QNode *pNode = pQ->pFront;
    pQ->pFront = pNode->pNext;
    free(pNode);

    // 若队列里面只有一个结点,删除后,队列为空,此时要改变队尾结点的状态
    if (pQ->pFront == NULL) {
        pQ->pRear = NULL;
    }
}

// 返回队首元素
QDataType QueueFront(Queue *pQ)
{
    assert(pQ != NULL);
    assert(pQ->size > 0);

    return pQ->pFront->data;
}

// 判断队列是否为空
// 1 为空, 0 不空
int QueueIsEmpty(Queue *pQ)
{
    return pQ->size == 0 ? 1 : 0;
}

// 返回队列数据个数
int QueueSize(Queue *pQ)
{
    return pQ->size;
}

void TestQueue()
{
    Queue queue;

    QueueInit(&queue);

    QueuePush(&queue, 1);
    QueuePush(&queue, 2); 
    QueuePush(&queue, 3);
    QueuePush(&queue, 4);

    QueuePop(&queue);
    QueuePop(&queue);
    QueuePop(&queue);
    QueuePop(&queue);

}

2.Main.c

#include "Queue.h"

int main()
{
    TestQueue();

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值