顾名思义,链式队列就是用链表的形式实现。与顺序队列的区别就是避免了空间溢出的问题。
还有就是顺序队列基本操作的空间复杂度都是O(1),而链式队列中插入操作的时间复杂度为O(n),因为要通过尾插和头删或头插和尾删来实现先进后出的规则。
- 结构体声明
typedef char LinkListType;
typedef struct LinkListQueue{
LinkListType data;
struct LinkListQueue* next;//和单链表的定义一般
}LinkListQueue;
- 具体函数声明
//创建节点
LinkListQueue* CreateNode(LinkListType value);
//初始化
void LinkListInit(LinkListQueue* head);
//销毁节点
void DestroyNode(LinkListQueue* node);
//入队列
void LinkListQueuePush(LinkListQueue** head,LinkListType value);
//出对列
void LinkListQueuePop(LinkListQueue** head);
//取队首元素
int LinkListQueueGetTop(LinkListQueue* head,LinkListType* value);
- 具体函数实现
初始化和销毁,因为要改变外部指针的指向,所以要用二级指针接收,释放内存空间的话只要持有指向该内存空间的指针即可,释放完该空间后,外部指针应置空,避免野指针的问题
void LinkListInit(LinkListQueue** head)
{
if(head == NULL)
{
//非法输入
return;
}
*head = NULL;
}
void DestroyNode(LinkListQueue* node)
{
free(node);
}
创建新节点
LinkListQueue* CreateNode(LinkListType value)
{
LinkListQueue* newNode = (LinkListQueue*)malloc(sizeof(LinkListQueue));
newNode->data = value;
newNode->next = NULL;
return newNode;
}
入队列和出队列
//尾插的基本操作
void LinkListQueuePush(LinkListQueue** head,LinkListType value)
{
if(head==NULL)
{
//非法输入
return;
}
if(*head==NULL)
{
//空队列
*head = CreateNode(value);
return;
}
LinkListQueue* cur = *head;
while(cur->next!=NULL)
{
cur=cur->next;
}
cur->next = CreateNode(value);
}
//头删基本操作
{
if(head==NULL)
{
//非法输入
return;
}
if(*head==NULL)
{
//空队列
return;
}
LinkListQueue* cur = *head;
*head = (*head)->next;
DestroyNode(cur);
//该函数调用完cur指针便会销毁,所以我省去了置空步骤,但是如果之后会用到该指针的话,最好让其置空
}
取队首元素
int LinkListQueueGetTop(LinkListQueue* head,LinkListType* value)
{
if(head==NULL)
{
//空队列
return 0;
}
*value = head->data;
return 1;
}