数据结构:链式队列

news2025/1/15 19:50:50

       队列是限制在两端操作进行插入操作与删除操作的线性表,允许进行插入操作的一端称为"队尾",允许进行删除操作的一端称为“队头”。当线性表中没有元素时,称为“空队”。队列的特点是先进先出。

队列两种规定:

1、front指向队头元素的前一个位置,rear指向队尾元素所在位置;以下代码采用第一种规定。

2、front指向队头元素所在位置,rear指向队尾元素的下一个位置;           

 queue.h

/*===============================================
*   文件名称:queue.h
*   创 建 者:cxy     
*   创建日期:2024年01月20日
*   描    述:
================================================*/
#ifndef _QUEUE_H
#define _QUEUE_H

#include <stdio.h>
#include <stdlib.h>

typedef struct node{    //节点
    int data;
    struct node *next;
}Node,*Pnode;

//规定1
typedef struct queue{    //队列指针
    Pnode front;  //头节点指针,指向队头元素的前一个位置
    Pnode rear;   //队尾指针,指向队尾元素所在位置
}Queue,*Pqueue;

int init(Pqueue *P);
int empty(Pqueue p);
int insert_queue(Pqueue p,int data);
int delete_queue(Pqueue p,int *data);
int sum(Pqueue p);
int clear_queue(Pqueue p);

#endif

queue.c

/*===============================================
*   文件名称:queue.c
*   创 建 者:cxy     
*   创建日期:2024年01月20日
*   描    述:
================================================*/
#include "queue.h"

int init(Pqueue *P)
{
    *P = malloc(sizeof(Queue));  //队列指针
    if(NULL == *P)
    {
        perror("init err:*P");
        return -1;
    }
    (*P)->front = malloc(sizeof(Node));  //头节点
    if(NULL == (*P)->front)
    {
        perror("init err:(*P)->front");
        return -1;
    }
    (*P)->rear = (*P)->front;   //空队
    (*P)->front->next = NULL;

    return 0;
}

int empty(Pqueue p)
{
    if(NULL == p)
    {
        perror("empty err:p");
        return -1;
    }
    if(p->front->next == NULL)
        return 1;
    else 
        return 0;
}

int insert_queue(Pqueue p,int data)
{
    if(NULL == p)
    {
        perror("insert err:p");
        return -1;
    }
    Pnode new = malloc(sizeof(new));
    if(NULL == new)
    {
        perror("insert err:new");
        return -1;
    }
    new->data = data;
    new->next = NULL;   //入队:队尾
    p->rear->next = new;
    p->rear = new;      //更新队尾
   
    return 0;
}

int delete_queue(Pqueue p,int *data)
{
    if(NULL == p)
    {
        perror("delete err:p");
        return -1;
    }
    if(empty(p))
    {
        perror("delete err:empty");
        return -1;
    }

    Pnode q = p->front->next;
    *data = q->data;
    p->front->next = q->next;   //更新队头元素为q->next
    free(q);

    if(p->front->next == NULL)  //空队
        p->rear = p->front;
    
    return 0;
}

int sum(Pqueue p)
{
    if(NULL == p)
    {
        perror("sum err:p");
        return -1;
    }
    Pnode q = p->front->next;
    int sum = 1;
    while(q->next)
    {
        q = q->next;
        sum++;
    }

    return sum;
}

int clear_queue(Pqueue p)
{
    if(NULL == p)
    {
        perror("clear err:p");
        return -1;
    }
    Pnode q = NULL;
    while(p->front->next)
    {
        q = p->front->next;
        p->front->next = q->next;
        free(q);
    }

    return 0;
}

main.c

/*===============================================
*   文件名称:main.c
*   创 建 者:cxy     
*   创建日期:2024年01月20日
*   描    述:
================================================*/
#include "queue.h"

int main(int argc, char *argv[])
{ 
    Pqueue p;
    init(&p);

    int data;
    printf("----------empty,1为空----------\n");
    data = empty(p);
    printf("%d\n",data);

    printf("----------insert_queue----------\n");
    for(int i = 0;i < 5;i++)
    {
        printf("请输入入队数据:");
        scanf("%d",&data);
        insert_queue(p,data);
    }

    printf("----------empty,1为空----------\n");
    data = empty(p);
    printf("%d\n",data);
    
    printf("----------sum----------\n");
    data = sum(p);
    printf("队列中共有:%d个数据\n",data);
    
    printf("----------delete_queue----------\n");
    for(int i = 0;i < 3;i++)
    {
        printf("出队数据为:");
        delete_queue(p,&data);
        printf("%d\n",data);
    }
    printf("----------empty,1为空----------\n");
    data = empty(p);
    printf("%d\n",data);

    
    printf("----------clear_queue----------\n");
    clear_queue(p);
    printf("----------empty,1为空----------\n");
    data = empty(p);
    printf("%d\n",data);

    return 0;
} 

结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1401119.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

应用层—HTTP详解(抓包工具、报文格式、构造http等……)

文章目录 HTTP1. 抓包工具的使用1.1 配置信息1.2 观察数据 2. 分析 https 抓包结果3. HTTP请求详解3.1 认识 URL3.1.1 URL 基本格式3.1.2 查询字符串 (query string)3.1.3 关于 URL Encode 3.2 认识 http 方法3.2.1 [经典问题] Get 和 Post 主要的区别是什么&#xff1f;&#…

Pytest 结合 Allure 生成测试报告

测试报告在项目中是至关重要的角色&#xff0c;一个好的测试报告&#xff1a; 可以体现测试人员的工作量&#xff1b; 开发人员可以从测试报告中了解缺陷的情况&#xff1b; 测试经理可以从测试报告中看到测试人员的执行情况及测试用例的覆盖率&#xff1b; 项目负责人可以通过…

Qt拖拽事件简单实现

1.相关说明 重写resizeEvent(这个按需重写)、dragEnterEvent(拖拽事件函数)、dropEvent(放下事件函数)&#xff0c;可以将本地图片拖拽到label标签中 2.相关界面 3.相关代码 #include "widget.h" #include "ui_widget.h" #include <QDragEnterEvent>…

5G_系统同步机制(八)

BBU和RRU的同步机制 为什么要做到系统同步 在TDD模式下工作时&#xff0c;为了避免相邻小区之间的干扰&#xff0c;近距离的所有gNB在任何时间点都必须具有相同的传输方向(DL或UL)。这样做的必要条件是在BTS之间同步SFN (System Frame number)和time Slot。此外&#xff0c;由…

c++程序的内存模型,new操作符详解

目录 内存四区 程序运行前 代码区 全局区 程序运行后 栈区 堆区 new操作符 创建一个数 创建一个数组 内存四区 不同区域存放不同的数据&#xff0c;赋予不同的生命周期&#xff0c;让我们更加灵活的编程 程序运行前 程序运行前就有代码区和全局区 代码区 程序编…

STM32标准库开发——PWM驱动代码

PWM驱动初始化代码 使能定时器二时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);设置定时器时钟源 TIM_InternalClockConfig(TIM2);配置定时器二的时基单元 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_TimeBaseInitStruct.TIM_ClockDivisionTIM_CKD_D…

java面试——juc篇

一、线程基础 1、进程与线程的区别&#xff1f;&#xff08;⭐⭐⭐&#xff09; 进程&#xff1a;进程是程序的一次执行过程&#xff0c;是操作系统资源分配的基本单位。程序由指令和数据组成&#xff0c;指令要运行就得加载至CPU&#xff0c;数据要读写就得加载至内存&#…

【嘉立创EDA-PCB设计指南】4.模块化布局

前言&#xff1a;本文对本专栏中的【嘉立创EDA-PCB设计指南】前面绘制的原理图进行模块化布局&#xff0c;首先进行预布局&#xff08;将每个模块放一起&#xff09;&#xff0c;然后进行精细化布局&#xff08;按照原理图来精细化布局&#xff09;。 目录 模块化预布局 模块…

电梯调度问题文献阅读

电梯调度问题文献阅读 文章目录 电梯调度问题文献阅读[toc]文献阅读1. 陈纪龙,孟洪兵,吴刚等.六层电梯模拟系统的研究与实现[J].伊犁师范学院学报(自然科学版),2014,8(01):57-62.2. 陈福兰,杜虹.浅析电梯并联运行的几种调度方法[J].装备制造技术,2012,(10):178-180190.3. 马春江…

洛谷(CodeForces)历年愚人节题目,难度普及+/提高,让你怀疑自己智商

INTERCALC 题目描述 DO YOU EXPECT ME TO FIND THIS OUT? WHAT BASE AND/XOR LANGUAGE INCLUDES string? DON’T BYTE OF MORE THAN YOU CAN CHEW YOU CAN ONLY DISTORT THE LARGEST OF MATHEMATICS SO FAR SAYING “ABRACADABRA” WITHOUT A MAGIC AND WON’T DO YOU …

IDEA怎么用Devtools热部署

IDEA怎么用Devtools热部署 大家知道在项目开发过程中&#xff0c;有时候会改动代码逻辑或者修改数据结构&#xff0c;为了能使改动的代码生效&#xff0c;往往需要重启应用查看改变效果&#xff0c;这样会相当耗费时间。 重启应用其实就是重新编译生成新的Class文件&#xff0…

流量控制与熔断利器:Sentinel介绍

这是《百图解码支付系统设计与实现》专栏系列文章中的第&#xff08;19&#xff09;篇&#xff0c;也是流量控制系列的第&#xff08;6&#xff09;篇。点击上方关注&#xff0c;深入了解支付系统的方方面面。 本篇聊聊流量控制与熔断利器Sentinel&#xff0c;背后的原理&…

【经典算法】有趣的算法之---粒子群算法梳理

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 粒子群算法 粒子群算法&#xff08;Particle Swarm Optimization&#xff0c;PSO&#xff09;是一种用于解决优化问题的元启发式算法。它通过模拟鸟群或…

csv数据导入hive表

文章目录 前言1、将csv文本文件放置hdfs目录下2、登录hive并进入到指定数据库3、创建表4、执行导入语句5、例子: 二、使用hue将csv数据导入hive表总结 前言 介绍将csv数据导入hive表 1、将csv文本文件放置hdfs目录下 2、登录hive并进入到指定数据库 3、创建表 create extern…

【Python代码】以线性模型为例,详解深度学习算法流程,包括数据生成、定义模型、损失函数、优化算法和训练

**使用带有噪声的线性模型构造数据集&#xff0c;并根据有限的数据恢复该线性模型的参数。**其中包括数据集构造、模型参数初始化、损失函数定义、定义优化算法和训练等过程。是大多数算法实现过程的一个缩影&#xff0c;理解此过程有助于在开发或改进算法时更深刻了解其算法的…

C#,实用新型加强版的整数数组

疫苗要打加强针&#xff01;数组要用加强版&#xff01; 三连发 加强版整数数组源代码https://mp.csdn.net/mp_blog/creation/editor/124151056 加强版实数数组源代码https://mp.csdn.net/mp_blog/creation/editor/124151110 加强版泛型数组源代码https://mp.csdn.net/mp_bl…

软件资源管理下载系统全新带勋章功能 + Uniapp前端

测试环境&#xff1a;php7.1。ng1.2&#xff0c;MySQL 5.6 常见问题&#xff1a; 配置好登录后转圈圈&#xff0c;检查环境及伪静态以及后台创建好应用 上传图片不了&#xff0c;检查php拓展fileinfo 以及public文件权限 App个人主页随机背景图&#xff0c;在前端uitl文件…

Java 面向对象02 封装 (黑马)

人画圆&#xff1a;画圆这个方法应该定义在园这个类里面。 人关门&#xff1a;是人给了门一个作用力&#xff0c;然后门自己关上了门&#xff0c;所以关门的方法是在门的类里面 封装对象的好处&#xff1a; 调用Java自带的方法举例实现&#xff1a; 在测试类中&#xff0c;对其…

Java中验证码功能的解决方案

目录​​​​​​​ 1、前言 2、随机数字验证码 2.1 使用Java的Random类生成随机数字 2.2 使用Java的Graphics2D类在图片上绘制验证码 3、字符验证码 3.1 生成包含随机字符的字符串 3.2 使用Java的Graphics2D类在图片上绘制验证码 ​​​​​​​​​​​​​​4、数学…

【设计模式】代理模式例子解析

代理模式&#xff0c;顾名思义&#xff0c;就是我们在需要访问一个类时&#xff0c;并不直接调用这个类&#xff0c;而是通过一个"代理"来间接地实现这个过程。 这个“代理”就像是真实对象的一个接口&#xff0c;所有的对于真实对象的操作都需要通过这个“代理”来…