一、链队的结构分析
1、链队是以链表的形式实现队列的先进先出(FIFO)的特性
这是链表的结构单元设计,那么我们现在需要思考的是,
我们是① 从头部入队插入元素,尾部出队删除元素
②从尾部入队插入元素,头部出队删除元素
(1)如果是从头部入队插入元素,尾部出队删除元素
那么头插的时间复杂度O(1),只需要将头指针指向新结点,不需要循环移动数据;尾删的时间复杂度为O(n)
(2)如果从尾部入队插入元素,头部出队删除元素
那么尾插的时间复杂度O(n),因为尾插需要找到倒数第二个结点,所以程序循环;头删的时间复杂度为O(1),只需要将头指针指向后一个结点
(3)我们知道链栈,最后我们用了循环链栈的处理方式提高效率,那链队有什么方式可以提高效率???
2、为提高效率,我们增加了一个尾指针。
此时我们发现,尾部入队插入元素,头部出队删除元素的时间复杂度都为O(1)
二、代码分析
1、结构定义
我们可以把phead和ptail看成是一个结构的两个部分,则需要定义一个结构体存放它们
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node* next;
}Node;
typedef struct LQueue
{
struct Node* phead;
struct Node* ptail;
}LQueue,*pQue;
2、初始化
void init(pQue pqu)
{
if (pqu != NULL)
{
//在堆上动态申请一个空间存放头结点,无实际意义
Node* pnhead = (Node*)malloc(sizeof(Node));
pnhead->next = NULL;
pqu->phead = pnhead;
pqu->ptail = pnhead;
}
}
初始化时让头指针和尾指针指向同一个位置
3、判空
int empty(pQue pqu)
{
return (pqu->phead == pqu->ptail) && (pqu->phead != NULL) ? 1 : 0;
}
如果在判空时只出现了pqu->phead == pqu->ptail