队列的模拟实现

#include
#include
#include
#include

//创建一个队列,头删和尾插,放入int类型
typedef int QueDatatype;
//队列节点
typedef struct Queuenode
{
    struct Queuenode* next;
    int data;
}Qnode;

//队列的首尾指针
typedef struct Queue
{
    Qnode* head;
    Qnode* tail;
    int size;
}Queue;

//初始化队列的首尾指针
void QueueInit(Queue* pq)
{
    assert(pq);
    pq->head = pq->tail = NULL;
    pq->size = 0;
}

//销毁队列
void QueDestory(Queue* pq)
{
    assert(pq);
    Qnode* cur = pq->head;
    while (cur)
    {
        Qnode* next = cur->next;
        free(cur);
        cur = next;
    }
}

//尾插
void QuePush(Queue* pq, QueDatatype x)
{
    Qnode* newnode = (Qnode*)malloc(sizeof(Qnode));
    if (newnode == NULL)
    {
        perror("malloc failed");
    }
    newnode->data = x;
    newnode->next = NULL;
    if (pq->head == NULL)
    {
        assert(pq->tail == NULL);
        pq->head = pq->tail = newnode;
    }
    else
    {
        pq->tail->next = newnode;
        pq->tail = newnode;
    }
    pq->size++;
}

//头删
void Quepop(Queue* pq)
{
    assert(pq);
    assert(pq->head != NULL);
    Qnode* pop = pq->head;
    if (pop->next = NULL) //只有一个元素

    {
        free(pop);
        pq->head = pq->tail = NULL;
    }
    else
    {
        pq->head = pq->head->next;
        free(pop);
    }
    pq->size--;
}

//读取队列中数据的个数
int Quesize(Queue* pq)
{
    assert(pq);
    return p->size;
}

//返回队列是否为空
bool QueEmpty(Queue* pq)  //非空 返回 0   空 返回1
{
    assert(pq);
    return pq->head == NULL;
}

//返回队列头的值
QueDatatype QueFront(Queue* pq)
{
    assert(pq);
    assert(!QueEmpty(pq));
    return pq->head->data;
}

//返回队列尾的值
QueDatatype QueBack(Queue* ps)
{
    assert(pq);
    assert(!QueEmpty(pq));
    return ps->tail->data;
}

你可能感兴趣的:(c语言)