队列(队列的出入,有效元素,判空,获取队头,队尾元素)

//队列的声明
#pragma once

typedef int QDataType;

typedef struct QNode{
    struct QNode* next;
    QDataType val;
}QNode;

typedef struct Queue{
    struct QNode* head;
    struct QNode* rear;
    QDataType _size;//记录有效元素的个数
}Queue;

//队列初始化
void QueueInit(Queue* q);

//队列入
void QueuePush(Queue* q, QDataType val);

//队列出
void QueuePop(Queue* q);

//有效元素的个数
int QueueSize(Queue* q);

//判断队列是否为空
int QueueEmpty(Queue* q);

//获取对头元素
QDataType QueueFront(Queue* q);

//获取队尾元素
QDataType QueueBack(Queue* q);

//测试代码
void QueueTest();


//队列的实现

#include "Queue.h"
#include
#include
#include
#include
#include

QNode* BuyNode(int val)
{
    QNode* newNode = (QNode*)malloc(sizeof(QNode));
    if (NULL == newNode)
    {
        assert(0);
        return NULL;
    }

    newNode->next = NULL;
    newNode->val = val;

    return newNode;
}

//队列初始化
void QueueInit(Queue* q)
{
    assert(q);
    q->head = BuyNode(0);
    q->rear = q->head;
    q->_size = 0;
}

//队列入
void QueuePush(Queue* q, QDataType val)
{
    assert(q);
    QNode* newNode = BuyNode(val);
    q->rear->next = newNode;
    q->rear = newNode;
    q->_size++;
}

//判断队列是否为空
int QueueEmpty(Queue* q)
{
    assert(q);
    //if (q->head >= q->rear)
    //{
    //    return true;
    //}

    //return false
    return 0 == q->_size;
}

//队列出
void QueuePop(Queue* q)
{
    QNode* pdelNode = NULL;
    if (QueueEmpty(q))
        return;

    pdelNode = q->head->next;
    q->head->next = pdelNode->next;
    free(pdelNode);
    q->_size--;

    
    //如果此时队列为空

    if (q->_size == 0)
        q->rear = q->head;
}

//有效元素的个数
int QueueSize(Queue* q)
{
    assert(q);
    return q->_size;
}

//获取队头元素
QDataType QueueFront(Queue* q)
{
    assert(!QueueEmpty(q));
    return q->head->next->val;
}

//获取队尾元素
QDataType QueueBack(Queue* q)
{
    assert(q);
    return q->rear->val;
}


//测试代码
void QueueTest()
{
    Queue q;
    QueueInit(&q);

    QueuePush(&q, 1);
    QueuePush(&q, 2);
    QueuePush(&q, 3);
    QueuePush(&q, 4);
    QueuePush(&q, 5);
    QueuePush(&q, 6);
    printf("Size:%d\n", QueueSize(&q));
    printf("Front:%d\n", QueueFront(&q));
    printf("Back:%d\n", QueueBack(&q));

    QueuePop(&q);
    QueuePop(&q);
    QueuePop(&q);
    printf("Size:%d\n", QueueSize(&q));
    printf("Front:%d\n", QueueFront(&q));
    printf("Back:%d\n", QueueBack(&q));

}

int main()
{
    QueueTest();
    system("pause");
    return 0;
}

你可能感兴趣的:(数据结构)