首页 > 其他分享 >链式队列的实现方式

链式队列的实现方式

时间:2024-08-18 09:54:09浏览次数:11  
标签:结点 LkQue 方式 temp 队列 void 链式 LQ

C语言实现链队列

LinkQueue.h

//
// Created by Administrator on 2024/8/17.
//

#ifndef LINKQUEUE_H
#define LINKQUEUE_H

#include <stdbool.h>

/** 定义队列元素结构体*/
typedef int DataType;
typedef struct LinkQueueNode {
    DataType data; //数据域
    struct LinkQueueNode *next; //指针域
} LkQueNode;

/** 定义队列结构体*/
typedef struct LkQueue{
    LkQueNode *front; //头指针,指向链队头结点
    LkQueNode *rear;  //尾指针,指向链队最后一个结点
} LkQue;

//队列初始化
void initQueue(LkQue *LQ);

//判断队列是否为空
bool EmptyQueue(LkQue *LQ);

//入队列
void EnQueue(LkQue *LQ, DataType x);

//出队列
void OutQueue(LkQue *LQ);

//输出队列首元素
void GetHead(LkQue *LQ);

//输出队列所有元素
void PrintEle(LkQue *LQ);

#endif //LINKQUEUE_H

LinkQueue.c

//
// Created by Administrator on 2024/8/17.
//
#include "LinkQueue.h"
#include <stdio.h>
#include "stdbool.h"
#include <stdlib.h>

//队列初始化
void initQueue(LkQue *LQ) {
    //生成队列头结点并分配动态空间
    LkQueNode *temp = (LkQueNode *) malloc(sizeof(LkQueNode));
    //队列头指针指向队列头结点
    LQ->front = temp;
    //队列尾指针指向队列尾结点
    LQ->rear = temp;
    //头结点指向的指针域为空
    (LQ->front)->next = NULL;
}

//判断队列是否为空
bool EmptyQueue(LkQue *LQ) {
    if (LQ->front == LQ->rear) {
        return true;
    }
    return false;
}

//入队列
void EnQueue(LkQue *LQ, DataType x) {
    //创建新结点并分配动态空间
    LkQueNode *temp = (LkQueNode *) malloc(sizeof(LkQueNode));
    //新结点temp的数据域存放输入的元素
    temp->data = x;
    //新结点temp的指针域设置为空
    temp->next = NULL;

    //将新结点temp插入到链队最后一个结点
    (LQ->rear)->next = temp;
    LQ->rear = temp;
    printf("元素 %d 入队成功!\n",x);
}

//出队列
void OutQueue(LkQue *LQ) {
    //声明结点temp存放队头结点数据
    LkQueNode *temp;
    //判断链队是否为空
    if (EmptyQueue(LQ)) {
        printf("队空");
    } else {
        //队头数据存放到结点temp
        temp = (LQ->front)->next;
        //修改头结点的指针域指向新的首结点,链队当中剩余数据向前移动
        (LQ->front)->next = temp->next;
        //链队当中仅有一个元素时,front和rear都指向头结点
        if (temp->next == NULL) {
            LQ->rear = LQ->front;
            printf("出队成功,出队元素为:%d\n", temp->data);
            //释放结点temp空间
            free(temp);
        }
        printf("出队成功,出队元素为:%d\n", temp->data);
    }
}

//输出队列首元素
void GetHead(LkQue *LQ) {
    //判断链队是否为空
    if (EmptyQueue((LQ))) {
        printf("队空");
    } else {
        //队列非空,返回队列首结点元素
        printf("队首元素为: %d\n", LQ->front->next->data);
    }
}

//输出队列所有元素
void PrintEle(LkQue *LQ) {
    printf("队列元素为:");
    LkQueNode *p;
    //判断链队是否为空
    if (EmptyQueue((LQ)))
        printf("队空");
    //头结点数据存放到结点p中
    p = LQ->front;
    //依次存放,直到头结点指针域为空结束
    while (p->next != NULL) {
        p = p->next;
        printf("%d ", p->data);
    }
    printf("\n");
}

main.c

void TestLinkQueue() {
    LkQue S;
    initQueue(&S);

    DataType a[5]={2,4,6,8,10};
    for (int i=0;i<5;i++) {
        EnQueue(&S,a[i]);
    }
    PrintEle(&S);

    OutQueue(&S);

    GetHead(&S);
}

程序运行图

image

标签:结点,LkQue,方式,temp,队列,void,链式,LQ
From: https://www.cnblogs.com/mingcore/p/18365316

相关文章

  • [Redis]延迟消息队列
    延迟消息队列redis数据结构,用什么结构实现延迟消息队列延迟消息队列是一种消息队列系统,它允许消息的发布者在消息发送时指定消息的投递时间,使消息在未来的某个预定时间点被消费者接收。这种机制对于需要在稍后执行的任务或具有特定延迟需求的应用非常有用。对于实现延迟消息队......
  • Spring DI实现方式
    1.set注入语法:1)set方法      2)set配置:<propertynamevauleref>2、构造注入语法:1)构造方法      2)构造配置:<constructor-argnametypeindexvalueref>3、注解注入(1)@Component用于标识一个类为Spring的组件,这个类会被Spring容器管理。......
  • JavaDoc生成文档两种方式
    JavaDoc生成文档方法一:通过命令行/***@authorzhang*@version1.0.0*@since1.8*/publicclasstest{Stringname;publicStringtest(Stringname)throwsException{returnname;}}在String下面输入/**,按Enter键在所建类中,......
  • DzzOffice修改权限判断方式解决另存为窗口新建文件无权限问题
    在执行另存为操作并选择文件与位置时,如提示无权限问题,此现象源于权限判断方式存在差异。为解决此问题,以在另存为窗口新建文件时提示无权限问题为例进行阐述。打开\dzz\system\fileselection\ajax.php文件。找到elseif($operation=='newIco'){//新建文件将perm_ch......
  • 铁电存储器(FM24W256)I2C读写驱动(2):写保护、设备地址、读写方式
    0参考资料FM24W256(Cypress公司生产)数据手册本例使用的FM24W256(soic-8封装)引脚示意图如下:1写保护WP引脚是写保护引脚,当WP被拉高时FM24W256写入无效,拉低时才能正常写入数据。该引脚在芯片内部下拉。相关描述如下:2FM24W256设备地址和AT24CXX系列EEPROM类似,FM24W25......
  • iPad作为扩展屏的最简单方式
    iPad作为扩展屏的最简单方式,主要取决于用户所使用的电脑操作系统(如macOS或Windows)以及iPad的型号和系统版本。以下将详细阐述在Mac和Windows环境下,将iPad作为扩展屏的最简单方法,并探讨其优势、应用场景及注意事项。一、Mac环境下使用iPad作为扩展屏的最简单方式对于Mac用......
  • 005、Vue3+TypeScript基础,组合式API给子页面命名的2种方式
    01、App.vue代码如下:<template><divclass="app"><h1>好好学习,天天向上</h1><Person/></div></template><script>//JS或TSimportPersonfrom'./view/PersonNew.vue'exportdefault{......
  • iPad作为扩展屏的最简单方式研究
    本研究针对iPad作为扩展屏的应用,深入探讨了其技术基础、实现方式及实际应用效果。研究发现,通过无线连接技术和特定控制软件,iPad能够轻松实现与主设备的屏幕扩展功能,极大地提升了用户在工作和学习中的效率和灵活性。在实际应用中,iPad作为扩展屏在多个领域如设计、编程、在线教育......
  • 面试题:在Java中,线程之间的通信主要通过哪几种方式实现?并简述其中一种方式的基本工作原
    面试题:在Java中,线程之间的通信主要通过哪几种方式实现?并简述其中一种方式的基本工作原理。请注意,除了直接回答此问题外,我们还为您准备了更多深入的学习资源和面试技巧。想要了解更多关于Java线程通信、优化简历、模拟面试、企业项目源码、大厂高并发面试题、项目场景题、算法......
  • 面试题:在Java中,多线程编程是常见的并发处理方式。请简述Java中实现多线程的几种主要方
    面试题:在Java中,多线程编程是常见的并发处理方式。请简述Java中实现多线程的几种主要方式,并解释每种方式的基本思想。更多关于多线程编程的深入解析、面试技巧、以及实战项目源码,手机浏览器即可访问面霸宝典【全拼音】.com,这里不仅可以优化你的简历,还能进行模拟面试,获取最新最......