本期我们来讲一下队列,队列也是一种线性的数据结构,具体表现为先进先出。就像我们生活中的排队一样。因为它先进先出的特性,所以我们还是使用链表来实现会效率高一些。我们还是从增删查改这几个维度来认识并学习队列。
我们首先要创建一个队列的数据结构,因为是链表实现,所以我们要先写出一个节点的结构。
typedef int datatype;
typedef struct QNode
{
datatype n;
struct QNode* next;
}QNode;
然后再接着写出队列的结构,队列的话因为我们是链表实现,头删效率很高,但是尾删因为要找尾所以效率很低,我们干脆直接把尾节点的指针写在结构里面。
typedef struct Queue
{
QNode* front;
QNode* rear;
int size;
}Queue;
创建好了队列我们首先要进行一下初始化:
void QueueInit(Queue* p)
{
p->front=p->rear=NULL;
p->size=0;
}
因为我们插入或者删除数据都会涉及节点的创建和销毁,所以我们还要写一个节点创建的函数。
QNode* BuyQNode(datatype x)
{
QNode* p = malloc(sizeof(QNode));
p->n = x;
p->next = NULL;
return p;
}
然后我们就可以开始写插入和删除函数了。
首先是插入函数,因为队列都是后进,所以就相当于是尾插。
void QueuePush(Queue* p, datatype x)
{
QNode* p = BuyQNode(x);
if(p->size==0)
{
p->front=p->rear=p;
}
else
p->rear->next = p;
p->size++;
}
删除节点在队列中都是头删。
void QueuePop(Queue* p)
{
assert(p->size>0);
QNode* p = p->front;
p->front = p->front->next;
p->size--;
free(p);
}
这样就完成了一个队列的书写了。