当前位置: 首页 > news >正文

数据结构(十)---链式队列

#### linkqueue.h

#ifndef _LQUEUE_H
#define _LQUEUE_H


//引入相关库
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


//定义元素数据类型的别名
typedef int DATA;


//定义链式队列的节点结构体
typedef struct node
{
    DATA data;     //节点数据
    struct node *next;     //后继指针
}NODE;


//定义链式队列的结构体
typedef struct 
{
    NODE *front;      //队头指针
    NODE *rear;       //队尾指针
    int size;         //队列元素个数
}LinkQueue;


/**
 * 队列初始化(初始属性的赋予)
 * @return 成功返回结构体指针q,否则返回NULL
 */
extern LinkQueue *lqueue_init();


/**
 * 判断队列是否为空
 * @param q 待操作的队列
 * @return 队列为空返回1,否则返回0
 */
extern int lqueue_isempty(LinkQueue *q);


/**
 * 入队
 * @param q 待操作的队列
 * @param data 待插入的数据
 * @return 成功返回0,否则返回-1
 */
extern int lqueue_enqueue(LinkQueue *q, DATA data);


/**
 * 出队(维护队头指针)---释放队头节点,然后将下一个节点作为新的队头节点
 * @param q 待操作的队列
 * @param data 接收出队元素的指针
 * @return 成功返回0,否则返回-1
 */
extern int lqueue_dequeue(LinkQueue *q, DATA *data);


/**
 * 待销毁的队列
 * @param q 待操作的队列
 */
extern void lqueue_destroy(LinkQueue *q);


#endif //_LQUEUE_H

```

#### linkqueue.c

#include "lqueue.h"


/**
 * 队列初始化(初始属性的赋予)
 * @return 成功返回结构体指针q
 */
LinkQueue *lqueue_init()
{
    // 分配队列结构体内存
    LinkQueue *q = (LinkQueue*)malloc(sizeof(LinkQueue));
    
    // 初始化双指针为NULL表示空队列
    q->front = q->rear = NULL;
    // 元素计数归零
    q->size = 0;
    
    return q;
}


/**
 * 判断队列是否为空
 * @param q 待操作的队列
 * @return 队列为空返回1,否则返回0
 */
extern int lqueue_isempty(LinkQueue *q)
{
    return q->front == NULL;     //队头指针为空即队列为空
}


/**
 * 入队(尾插法)
 * @param q 待操作的队列
 * @param data 待插入的数据
 * @return 成功返回0,否则返回-1
 */
int lqueue_enqueue(LinkQueue *q, DATA data)
{
    //创建新节点
    NODE *p = (NODE*)malloc(sizeof(NODE));
    if(!p)
    {
        perror("Memory allocation failed!");
        return -1;
    }
    
    //存储数据
    p->data = data;
    p->next = NULL;     //新节点作为队尾,next置空
    
    //空队列特殊处理
    if(q->rear == NULL)
    {
        q->front = q->rear = p;
    }
    //非空队列
    else
    {
        //原队尾节点链接新节点
        q->rear->next = p;
        //更新队尾指针
        q->rear = p;
    }
    
    //元素计数增加
    q->size++;
    
    return 0;
}


/**
 * 出队(维护队头指针)---释放队头节点,然后将下一个节点作为新的队头节点
 * @param q 待操作的队列
 * @param data 接收出队元素的指针
 * @return 成功返回0,否则返回-1
 */
int lqueue_dequeue(LinkQueue *q, DATA *data)
{
    //判断队列是否为空
    if(lqueue_isempty(q))
    {
        printf("Queue is empty!\n");
        return -1;
    }
    
    //暂存队头节点
    NODE *head = q->front;
    //通过指针传出数据
    *data = head->data;
    
    //队头指针后移
    q->front = head->next;
    //如果队列已空,重置rear指针
    if(q->front == NULL)
    {
        q->rear == NULL;
    }
    
    free(head);     //释放原队头节点内存
    
    //元素计数个数减少
    q->size--;
    
    return 0;
}


/**
 * 待销毁的队列
 * @param q 待操作的队列
 */
void lqueue_destroy(LinkQueue *q)
{
    //空指针检查
    if(!q)
        return;
    
    DATA temp;
    
    //循环出队
    while(!lqueue_isempty(q))
    {
        lqueue_dequeue(q, &temp);
    }
    
    free(q);     //结构体是动态分配的话就需要释放结构体队列内存
}
```

#### app.c

#include "lqueue.h"

int main(int argc,char *argv[])
{
    LinkQueue *q = lqueue_init();
    
    // 入队测试
    for (int i = 1; i <= 5; i++) {
        lqueue_enqueue(q, i*10);
        printf("Enqueued: %d\n", i*10);
    }
    
    // 出队测试
    int val;
    while (!lqueue_isempty(q)) {
        lqueue_dequeue(q, &val);
        printf("Dequeued: %d\n", val);
    }
    
    lqueue_destroy(q);
    
    return 0;
}

相关文章:

  • 一文掌握 npm 基础与常用指令
  • Linux命令使用记录(自用)
  • 深度解析Qwen3:性能实测对标Gemini 2.5 Pro?开源大模型新标杆的部署挑战与机遇
  • 文心一言开发指南08——千帆大模型平台推理服务API
  • Manus AI多语言手写识别技术全解析:从模型架构到实战部署
  • MAC安装unar并解压.rar文件
  • 基于AutoDL V100微调DeepSeek Coder 6.7B (2)
  • 智体OS-V3.7重大发布:智体管家2.0、ai-docs知识库2.0、mcphost支持千款MCP-server、氛围电商或知识库电商模板、智体轻聊网页版
  • Java 多线程基础:Thread 类详解
  • 【Sqlalchemy Model转换成Pydantic Model示例】
  • 【含文档+PPT+源码】基于SSM的电影数据挖掘与分析可视化系统设计与实现
  • 嵌入式学习笔记 - 关于STM32 SPI控制器读取以及写入时,标志位TXE, RXNE的变化
  • Leetcode 3530. Maximum Profit from Valid Topological Order in DAG
  • C#实现对达索(Dassault)SolidWorks中3D图纸转化为手机可直接查看预览图纸格式
  • 扣子流程图批量导入飞书多维表格
  • springboot 框架把 resources下的zip压缩包, springboot 项目启动后解压到项目根目录工具类
  • 域对齐是什么
  • 基于STM32、HAL库的ATECC608B安全验证及加密芯片驱动程序设计
  • Kotlin-高阶函数,Lambda表达式,内联函数
  • Spring Boot × K8s 监控实战-集成 Prometheus 与 Grafana
  • “铁血防守”制造8年最快丢球,恐惧中的阿森纳什么也做不了
  • 马上评丨准入壁垒越少,市场活力越足
  • 夜读丨怀念那个写信的年代
  • 上海112位全国劳动模范和先进工作者接受表彰,樊振东榜上有名
  • 幸福航空五一前三天航班取消:客服称目前是锁舱状态,无法确认何时恢复
  • 网警侦破特大“刷量引流”网络水军案:涉案金额达2亿余元