数据结构(c语言版) 队列

news2024/11/25 23:50:49

链队列

要求:实现链队列的创建、初始化、入队、出队 (先进先出)

代码

//
// Created by My.cy on 2023/10/19.
//
//链队列  创建、初始化、入队、出队   先进先出

#include <stdio.h>
#include <malloc.h>


//定义结构体
struct Node{
    int data;
    struct Node* next;
};

//将头指针和尾指针封装在一起
struct FR{
    struct Node* front;
    struct Node* rear;
};

//初始化
void init(struct Node* node, struct FR* fr){
    node->next = NULL;
    fr->front = node;
    fr->rear = node;
}

//入队
void inqueue(struct FR* fr, int value){
    struct Node* NewNode = malloc(sizeof(struct Node));
    if(NewNode){
        NewNode->data = value;
        NewNode->next = NULL;
        fr->rear->next = NewNode;
        fr->rear = NewNode;
        printf("数据 %d 入队成功,地址为 %p \n",value, NewNode);
    }
}

//显示队列
void isqueue(struct FR* fr){
    struct Node* temp = fr->front;
    while (temp->next != NULL){
        printf("%d-->", temp->next->data);
        temp = temp->next;
    }
}

//出队列
void outqueue(struct FR* fr){
    if(fr->front->next == NULL){
        printf("出队列失败:队列为空!\n");
    }

    struct Node* temp = fr->front->next;
    int value = temp->data;

    if(temp->next == NULL){
        fr->front->next = NULL;
        free(temp);
        printf("数据 %d 出队列成功!\n",value);
        return;
    }
    fr->front->next = temp->next;
    free(temp);
    printf("数据 %d 出队列成功!\n",value);

}

int main(){
    struct Node node;
    struct FR fr;
    //初始化
    init(&node, &fr);

    printf("*********************链队列入队操作*********************\n");
    int value;
    printf("请输入入队的数据(输入0则结束):");
    scanf("%d",&value);
    while (value != 0){
        inqueue(&fr, value);
        printf("请输入入队的数据(输入0则结束):");
        scanf("%d",&value);
    }

    printf("\n*********************链队列显示操作*********************\n");
    isqueue(&fr);

    printf("\n*********************链队列出栈操作*********************\n");
    int out;
    printf("出队列输入1,结束输入0:");
    scanf("%d",&out);
    while (1){
        if(out == 1){
            outqueue(&fr);
        }
        if(out == 0){
            break;
        }
        printf("出队列输入1,结束输入0:");
        scanf("%d",&out);
    }

    printf("\n*********************链队列显示操作*********************\n");
    isqueue(&fr);

    printf("\n*********************链队列入队操作*********************\n");
    int value_1;
    printf("请输入入队的数据(输入0则结束):");
    scanf("%d",&value_1);
    while (value_1 != 0){
        inqueue(&fr, value_1);
        printf("请输入入队的数据(输入0则结束):");
        scanf("%d",&value_1);
    }

    printf("\n*********************链队列显示操作*********************\n");
    isqueue(&fr);

}

运行结果

在这里插入图片描述

循环队列

要求:循环队列的 创建、入队列、出队列,显示队列 (计数器方法)

代码

//
// Created by My.cy on 2023/10/19.
//
//循环队列(计数器方法)     创建、入队列、出队列,显示队列       先进先出

#include <stdio.h>
#define MAXSIZE 5


struct C_S_Queue{
    int data[MAXSIZE];
    int front;
    int rear;
    int num;
};

//初始化
void init(struct C_S_Queue* CSQ){
    CSQ->front = 0;
    CSQ->rear = 0;
    CSQ->num = 0;
}

//入队列
void inQueue(struct C_S_Queue* CSQ, int value){
    if(CSQ->num == MAXSIZE){
        printf("入队列失败:队列为满队列!\n");
        return;
    }
    int index = CSQ->rear % MAXSIZE;
    CSQ->data[index] = value;
    CSQ->rear = (CSQ->rear + 1) % MAXSIZE;
    CSQ->num ++;
    printf("数据 %d 在数组的第 %d 位入队成功!\n",value, index+1);
}

//出队列
void outQueue(struct C_S_Queue* CSQ){
    if(CSQ->num == 0){
        printf("出队列失败:队列为空队列!\n");
        return;
    }
    int index = CSQ->front % MAXSIZE;
    int value = CSQ->data[index];
    CSQ->front = (CSQ->front + 1) % MAXSIZE;
    CSQ->num --;
    printf("数据 %d 出队列成功!\n", value);
}


//显示队列
void isQueue(struct C_S_Queue* CSQ){
    if(CSQ->num == 0){
        printf("显示队列失败:队列为空队列!\n");
        return;
    }
    int index = 1;
    int f = CSQ->front % MAXSIZE;

    while (index <= CSQ->num){
        printf("队列第 %d 位数据为 %d \n",index, CSQ->data[f]);
        f = (f+1)%MAXSIZE;
        index ++;
    }
}

int main(){
    struct C_S_Queue CSQ;
    //初始化
    init(&CSQ);

    printf("*********************循环队列入队操作*********************\n");
    int value;
    printf("请输入入队的数据(输入0则结束):");
    scanf("%d",&value);
    while (value != 0){
        inQueue(&CSQ, value);
        printf("请输入入队的数据(输入0则结束):");
        scanf("%d",&value);
    }

    printf("*********************显示循环队列操作*********************\n");
    isQueue(&CSQ);

    printf("*********************循环队列出队操作*********************\n");
    int out;
    printf("出队列输入1,结束输入0:");
    scanf("%d",&out);
    while (1){
        if(out == 1){
            outQueue(&CSQ);
        }
        if(out == 0){
            break;
        }
        printf("出队列输入1,结束输入0:");
        scanf("%d",&out);
    }

    printf("*********************显示循环队列操作*********************\n");
    isQueue(&CSQ);

    printf("*********************循环队列入队操作*********************\n");
    int value_1;
    printf("请输入入队的数据(输入0则结束):");
    scanf("%d",&value_1);
    while (value_1 != 0){
        inQueue(&CSQ, value_1);
        printf("请输入入队的数据(输入0则结束):");
        scanf("%d",&value_1);
    }

    printf("*********************显示循环队列操作*********************\n");
    isQueue(&CSQ);

}

运行结果

*********************循环队列入队操作*********************
请输入入队的数据(输入0则结束):123
数据 123 在数组的第 1 位入队成功!
请输入入队的数据(输入0则结束):23
数据 23 在数组的第 2 位入队成功!
请输入入队的数据(输入0则结束):34
数据 34 在数组的第 3 位入队成功!
请输入入队的数据(输入0则结束):445
数据 445 在数组的第 4 位入队成功!
请输入入队的数据(输入0则结束):142
数据 142 在数组的第 5 位入队成功!
请输入入队的数据(输入0则结束):0
*********************显示循环队列操作*********************
队列第 1 位数据为 123
队列第 2 位数据为 23
队列第 3 位数据为 34
队列第 4 位数据为 445
队列第 5 位数据为 142
*********************循环队列出队操作*********************
出队列输入1,结束输入01
数据 123 出队列成功!
出队列输入1,结束输入01
数据 23 出队列成功!
出队列输入1,结束输入00
*********************显示循环队列操作*********************
队列第 1 位数据为 34
队列第 2 位数据为 445
队列第 3 位数据为 142
*********************循环队列入队操作*********************
请输入入队的数据(输入0则结束):100
数据 100 在数组的第 1 位入队成功!
请输入入队的数据(输入0则结束):0
*********************显示循环队列操作*********************
队列第 1 位数据为 34
队列第 2 位数据为 445
队列第 3 位数据为 142
队列第 4 位数据为 100

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

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

相关文章

【电源专题】PSE如何与PD握手协商功率等级?

在文章:【电源专题】POE连接方式与功率等级划分 中我们讲到POE协议对不同的PD设备进行划分,比如根据不同的供电标准又可以细分成好几种不同的类型(Type1~Type4)和功率等级。 那么有这么多功率等级,PSE怎么知道PD是哪种类型呢?怎么能进行握手协商呢? 下图为PSE与PD设备在…

Linux学习第36天:Linux RTC 驱动实验:时间是一条流淌的河

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 RTC就是实时时钟。 本笔记主要学习Linux RTC驱动试验&#xff0c;主要内容包括Linux内核RTC驱动简介、I.MX6U内部RTC分析、RTC时间查看与设置。因为Linux内核已经…

用 bitsandbytes、4 比特量化和 QLoRA 打造亲民的 LLM

众所周知&#xff0c;LLM 规模庞大&#xff0c;如果在也能消费类硬件中运行或训练它们将是其亲民化的巨大进步。我们之前撰写的 LLM.int8 博文 展示了我们是如何将 LLM.int8 论文 中的技术通过 bitsandbytes 库集成到 transformers 中的。在此基础上&#xff0c;我们不断努力以…

怎么学编程效率高,编程练习网站编程软件下载,中文编程开发语言工具下载

怎么学编程效率高&#xff0c;编程练习网站编程软件下载&#xff0c;中文编程开发语言工具下载 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#xff0c;而且可以开发大型的…

word方框中的对勾如何打?

问题描述&#xff1a;平时在填一些电子版表格时&#xff0c;需要在方框里打对勾&#xff0c;这时如何打呢&#xff1f; 问题解决&#xff1a;符号→其他符号→字体调整为Wingdings 2→找到方框里有对勾的符号&#xff0c;插入即可。 具体如下图所示&#xff1a;

武汉凯迪正大—气体密度继电器校验仪

产品概述 武汉凯迪正大SF6气体密度继电器是用来监测运行中SF6开关本体中SF6气体密度变化的重要元件&#xff0c;其性能的好坏直接影响到SF6开关的运行安全。现场运行的SF6气体密度继电器因不常动作&#xff0c;经过一段时期后常出现动作不灵活、触点接触不良等现象&#xff0c…

Flink架构

1、Apache Flink集群的核心架构&#xff1a; 1、client&#xff08;作业客户端&#xff09;&#xff1a;提交任务的地方叫做客户端 2、JobManager&#xff08;作业管理器&#xff09;&#xff1a;作用是用于管理集群中任务 3、TaskManager&#xff08;任务管理器&#xff09;&a…

wsl2 ubuntu22.04安装docker

1. 安装 docker 官网的步骤一步一步安装即可 Install Docker Engine on Ubuntu | Docker Docs 2. 安装完毕之后&#xff0c;不出意外的话当你运行docker version或者其他命令的时候你会报如下错误&#xff1a; Cannot connect to the Docker daemon at unix:///var/run/docke…

蓝桥杯:分数

题目 思路 等比数列求和&#xff0c;手算然后输出 代码&#xff08;已过&#xff09; #include <iostream> using namespace std; int main() {// 请在此输入您的代码int a1024*1024-1;int b1024*512;cout<<a<<"/"<<b;return 0; }

Unity 实现文字过长显示省略号

为了整体效果&#xff0c;当文字过长时&#xff0c;我们就会把超出范围的文字弄成省略号。 要实现文字过长显示省略号&#xff0c;只需要使用TextMeshPro&#xff0c;并设置Overflow属性为Ellipsis即可。 如下图&#xff1a; 记。

【刷题篇】动态规划(三)

文章目录 1、第 N 个泰波那契数2、三步问题3、使用最小花费爬楼梯4、解码方法5、不同路径6、不同路径 II 1、第 N 个泰波那契数 泰波那契序列 Tn 定义如下&#xff1a; T0 0, T1 1, T2 1, 且在 n > 0 的条件下 Tn3 Tn Tn1 Tn2 给你整数 n&#xff0c;请返回第 n 个泰波…

Spring基础(2):放弃XML,走向注解

上一篇并没有实际地带大家去看源码&#xff0c;而是介绍了两个概念&#xff1a; BeanDefinitionBeanPostProcessor 当然&#xff0c;我介绍得非常笼统&#xff0c;不论是BeanDefinition还是BeanPostProcessor其实都有着较为复杂的继承体系&#xff0c;种类也很多。作为Spring…

文心一言 VS 讯飞星火 VS chatgpt (130)-- 算法导论11.2 2题

二、用go语言&#xff0c;对于一个用链接法解决冲突的散列表&#xff0c;说明将关键字 5,28,19,15,20,33,12,17,10 插入到该表中的过程。设该表中有 9 个槽位&#xff0c;并设其散列函数为 h(k)k mod 9。 文心一言&#xff1a; 在这个问题中&#xff0c;我们使用 Go 语言来解…

Day23力扣打卡

打卡记录 将 x 减到 0 的最小操作数&#xff08;逆向思维 滑动窗口&#xff09; 链接 将 x 减到 0 的最小操作数&#xff0c;可以逆向思考&#xff0c;求一个数组中的最大长度的滑动窗口&#xff0c;来使得这个窗口里的数等于 全数组之和 - x 的值。 class Solution { publ…

MySQL(11):数据处理之增删改

插入数据 方式1&#xff1a; 一条一条的添加数据 为表的所有字段按默认顺序插入数据 INSERT INTO 表名 VALUES (value1,value2,....);# 没有指明添加的字段 INSERT INTO emp1 VALUES (1,TOM,2023-11-06,3400);没有指明添加的字段&#xff0c;要按照声明顺序&#xff0c;进行…

U_boot介绍

系统移植之前的了解的&#xff1a; 首先需要移植一个 bootloader 代码&#xff0c;这个 bootloader 代码用于启动 Linux 内核&#xff0c;bootloader 有很多&#xff0c;常用的就是 U-Boot;移植好 U-Boot 以后再移植 Linux 内核&#xff0c;移植完 Linux 内核以后 Linux 还不能…

Flink SQL Window TopN 详解

Window TopN 定义&#xff08;⽀持 Streaming&#xff09;&#xff1a; Window TopN 是特殊的 TopN&#xff0c;返回结果是每⼀个窗⼝内的 N 个最⼩值或者最⼤值。 应⽤场景&#xff1a; TopN 会出现中间结果&#xff0c;出现回撤数据&#xff0c;Window TopN 不会出现回撤数据…

网络架构新升级:400G OSFP光模块系列产品概述

移动数据、互联网、大数据的发展和需要&#xff0c;400G OSFP越来越受到市场的欢迎。说起400G的封装形式&#xff0c;大多数人脱口而出的肯定是QSFP-DD&#xff0c;而我们今天给大家介绍的是400G的另一种封装——OSFP。下面就跟着小易来了解一下吧&#xff01; 一、OSFP光模块…

SSM-spring注解式缓存redis

目录 一.redis整合 1.1.pom配置 1.2.配置文件spring-redis.xml 1.3.配置redis的key生成策略 二.redis的注解式开发及应用场景 2.1.什么是redis的注解式 2.2.Cacheable 2.3.自定义策略 2.4.CachePut 注解 三.redis的击穿穿透雪崩 1.击穿问题 2.穿透问题 3.雪崩问题 一…

《golang设计模式》第三部分·行为型模式-05-仲裁者/中介模式(Mediator)

文章目录 1. 概述1.1 作用1.2 角色1.3 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概述 仲裁者&#xff08;Mediator&#xff09;可以封装和协调多个对象之间的耦合交互行为&#xff0c;以减弱这些对象之间的耦合关联。 1.1 作用 将多个对象相互耦合的设计转变为所有对象…