队列的链表实现形式,在链表中,入队操作相当于链表中的尾插操作,出队操作相当于链表当中的头删操作。
为了使得在链表中队列的出队入队操作的时间复杂度也都是O(1)因此我们需要第一时间可以找到链表的头和链表的尾。为此,我们需要在头结点中定义两个指针域分别指向队列的头节点的地址和队列的尾节点的地址。具体结构如下图所示:
头节点的结构体成员里面有两个指针域,而有效数据节点的结构体成员只有一个指针域,因此为了避免空间浪费,我们对头节点和有效数据节点分别单独设计结构体:
typedef int ELEM_TYPE;
//有效数据节点的结构体设计
typedef struct Node
{
ELEM_TYPE data; //数据域
struct Node* next; // 指针域
}Node,*PNode;
//头节点的结构体设计
typedef struct LQueue
{
struct Node* front;
struct Node* rear;
}LQueue,*PLQueue;
链式队列的出队,相当于单链表的头删
值得注意的是,若是链表中只有一个元素,那么需要将头节点的front和rear域都置为NULL
若是有多个元素只需要和单链表的头删一样操作
//入队
bool Push(struct