数据结构<八>链式队列

目录

一、链式队列的定义

二、链式队列的创建与初始化

三、链式队列的操作

四、链式队列测试主程序

一、链式队列的定义
复制代码
链式队列是一种使用链表实现的队列,它由一个头指针和一个尾指针组成,分别指向队列的头节点和尾结点。
它通过链表的方式将队列中的节点串联起来,使得插入和删除操作都只需要在队列的首尾完成,不需要移动其他元素。
新元素被添加到队列的尾部,老元素从队列的头部出队。
链式队列相对于顺序队列来说,可以动态地增加和删减队列中的元素,但是因为使用了指针,其对内存要求较高。
二、链式队列的创建与初始化
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;
}
相关推荐
用户昵称1009 小时前
C/C++编程-工程实践-本地存储log的工程意义
c语言·开发语言
Tisfy11 小时前
LeetCode 3345.最小可整除数位乘积 I:暴力枚举(从n开始尝试)
数学·算法·leetcode·题解·枚举
DolphinDB智臾科技11 小时前
告别 TB 级数据搬运:DolphinDB 滤波算法库,重塑物联网数据价值链
物联网·算法
可编程芯片开发12 小时前
基于双PI控制器结构的六步逆变器供电无刷直流电机调速simulink仿真
算法
Sagittarius_A*12 小时前
后量子密码|通识认知 02|量子威胁核心原理:Shor 算法如何击穿传统公钥密码
算法·信息安全·密码学·量子计算
青山木12 小时前
Hot 100 --- 在排序数组中查找元素的第一个和最后一个位置
java·数据结构·算法·leetcode
其美杰布-富贵-李13 小时前
聚类算法详解:K-means、层次聚类与 DBSCAN
算法·机器学习·kmeans·聚类
碧海银沙音频科技研究院13 小时前
4 BES2710编译环境搭建方法
嵌入式硬件·算法
老师我太想进步了202613 小时前
C语言版讲解函数递归
c语言·开发语言
mifengxing13 小时前
LeetCode 238 除自身以外数组的乘积|无除法O(n)时间+O(1)空间双解法
java·算法·leetcode