->Gitee源码点击这里<-
队列也是线性表,队列在实现时用链表效率更高。
队列的数据处理遵循先进先出原则,所以设计队列的接口时,需要设计头删接口和尾插接口,才能达到先进进出的效果。
队列逻辑示意图
单链表实现,自然要有结点,所以我们要先创建单链表结点的结构体
typedef struct Node
{
QDatatype data;
struct Node* next;
};
光有结点还不足以表示队列,队列的核心在于队头和队尾,有了这两个元素才方便我们设计相应的数据处理接口,所以我们在定义一个队列的结构体
typedef struct Queue
{
Node* head;
Node* tail;
};
在主函数中创建一个队列类型的变量,即创建了一个队列,该变量下有两个指针成员,分别指向了队列的第一个结点和最后一个结点
int main()
{
Queue myqueue;
}
队列创建后,需要对队列进行初始化,队列刚被创建时,队列中没有元素,所以头指针和尾指针都指向NULL
void QueueInit(Queue* pq)
{
assert(pq);
pq->head = pq->tail = NULL;
}
接着,我们需要设计数据处理接口
一、入队
我们需要做如下思考:
a.第一个数据结点入队时该作何处理?
第一个结点入队时,head
和tail
同时指向该结点
b.此后该如何处理?
当队中有结点之后,再入结点时,先让原来的tail
指向的最后一个结点中的next
存放新节点的地址,然后tail
再指向新结点
示意图:
void QueuePush(Queue* pq, QDatatype data)
{
//入队首先要创建一个新结点出来
Node* newnode = (Node*