链式队列:利用带尾指针的单链表实现
1、头文件(lqueue.h)
#pragma once//防止头文件重复引用
typedef struct QNode
{
int data;
struct QNode *next;
}QNode;
typedef struct HNode
{
QNode *front;//队头指针
QNode *rear;//队尾指针
}HNode,*PLQueue;
//初始化
void InitQueue(PLQueue pq);
//入队
bool Push(PLQueue pq,int val);
//出队
bool Pop(PLQueue pq,int *rtval);
//判空
bool IsEmpty(PLQueue pq);
//获得队头
bool GetTop(PLQueue pq,int *rtval);
//摧毁
void Destroy(PLQueue pq);
2、源文件(lqueue.cpp)
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "lqueue.h"
//初始化
void InitQueue(PLQueue pq)
{
assert(pq != NULL);
pq->front = NULL;
pq->rear = NULL;
}
//入队
bool Push(PLQueue pq,int val)//O(1)
{
QNode *p = (QNode *)malloc(sizeof(QNode));
p->data = val;
p->next = NULL;
if(pq->front == NULL)//判断队空if(IsEmpty(pq))
{
pq->front = p;
pq->rear = p;
}
else
{
pq->rear->next = p;
pq->rear = p;
}
return true;
}
//出队(获得队头并删除)
bool Pop(PLQueue pq,int *rtval)//O(1)
{
if(IsEmpty(pq))
{
return false;
}
QNode *p = pq->front->next;
*rtval = p->data;
pq->front = p->next;
free(p);
return true;
}
//判空
bool IsEmpty(PLQueue pq)
{
return pq->front == NULL;
}
//获得队头但不删除
bool GetTop(PLQueue pq,int *rtval)
{
if(IsEmpty(pq))
{
return false;
}
QNode *p = pq->front->next;
*rtval = p->data;
return true;
}
//摧毁
void Destroy(PLQueue pq)
{
while(pq->front)
{
pq->rear = pq->front->next;
free(pq->front);
pq->front = pq->rear;
}
}
3、测试源文件(test.cpp)
#include <stdio.h>
#include <vld.h>
#include "lqueue.h"
int main()
{
HNode p;
InitQueue(&p);
for(int i = 0; i < 10;i++)
{
Push(&p,i);//入队
}
int tmp;
while(!IsEmpty(&p))
{
Pop(&p,&tmp);//出队
printf("%d\n",tmp);
}
Destroy(&p);//摧毁
Destroy(&p);
return 0;
}