目录
一、链式队列的定义
链式队列是一种使用链表实现的队列,它由一个头指针和一个尾指针组成,分别指向队列的头节点和尾结点。
它通过链表的方式将队列中的节点串联起来,使得插入和删除操作都只需要在队列的首尾完成,不需要移动其他元素。
新元素被添加到队列的尾部,老元素从队列的头部出队。
链式队列相对于顺序队列来说,可以动态地增加和删减队列中的元素,但是因为使用了指针,其对内存要求较高。
二、链式队列的创建与初始化
cpp
//链式队列的创建
typedef struct node
{
int data; // 数据域
struct node *next; // 指针域
} linklist_t; // 链表类型
typedef struct
{
linklist_t *front; // 队头
linklist_t *rear; // 队尾
} linkqueue_t;
//链式队列的初始化
linkqueue_t *linkqueue_init(void)
{
linkqueue_t *q = (linkqueue_t *)malloc(sizeof(linkqueue_t));
linklist_t *h = (linklist_t *)malloc(sizeof(linklist_t));
h->next = NULL;
q->front = h;
q->rear = h;
return q;
}
三、链式队列的操作
cpp
//链式队列是否为空
int linkqueue_isempty(linkqueue_t *q)
{
return (q->front == q->rear);
}
cpp
//入队 尾插法
int linkqueue_enqueue(linkqueue_t *q, int val)
{
linklist_t *p = (linklist_t *)malloc(sizeof(linklist_t));
p->data = val; // 给节点赋值
p->next = q->rear->next; // 尾部插入第1步
q->rear->next = p; // 尾部插入第2步
// 把rear 移动到 p的位置上
q->rear = p;
return 0;
}
cpp
//出队 头删法
int linkqueue_dequeue(linkqueue_t *q, int *val)
{
linklist_t *p; // p 保存要删除的节点
if (linkqueue_isempty(q))
{
printf("队列为空");
return -1;
}
p = q->front->next; // p 指向头节点的下一个节点
q->front->next = p->next; // 头部删除
if(q->front->next == NULL) // 处理特出情况 队列已经空
{
q->rear = q->front ; // 队尾也指向头节点
}
*val = p->data; // 先将数据赋值给val
free(p); // 释放内存
return 0;
}
四、链式队列测试主程序
cpp
int main(int argc, char const *argv[])
{
linkqueue_t *Q = linkqueue_init();
printf("入队顺序:");
for (int i = 0; i < 5; i++)
{
if (linkqueue_enqueue(Q, i + 1) == 0)
{
printf("%d ", i + 1);
}
}
printf("\n");
printf("出队顺序:");
for (int i = 0; i < 5; i++)
{
int val;
if (linkqueue_dequeue(Q, &val) == 0)
{
printf("%d ", val);
}
}
printf("\n");
printf("入队顺序:");
for (int i = 0; i < 6; i++)
{
if (linkqueue_enqueue(Q, i + 6) == 0)
{
printf("%d ", i + 6);
}
}
printf("\n");
printf("出队顺序:");
for (int i = 0; i < 7; i++)
{
int val;
if (linkqueue_dequeue(Q, &val) == 0)
{
printf("%d ", val);
}
}
printf("\n");
return 0;
}