C语言实现顺序队列

在C语言中,顺序队列是一种数据结构,它是一种先进先出(FIFO)的线性表。顺序队列通常使用数组来实现,具有以下特点:

  1. 队列元素的插入操作(入队)只能在队尾进行,而删除操作(出队)只能在队首进行。
  2. 队列有一个固定的大小,一旦队列满了就无法插入新的元素。
  3. 队列会随着元素的出队操作而缩短,随着元素的入队操作而延长。

在C语言中,顺序队列通常通过数组和两个指针(分别指向队首和队尾)来实现。入队操作通常会使队尾指针向后移动,并将新元素放入队尾;而出队操作会使队首指针向后移动,同时返回队首元素,并将队首元素从队列中删除。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"dongtaishuzu.h"
#define MAX 1024
typedef void* seqQueue;
seqQueue init_seqqueue()
{dynaymicArray* arr = init_dynamicArray(MAX);return (void*)arr;
}
//入队-》尾插
void push_seqqueue(seqQueue queue,void*data)
{if (queue == NULL){return;}dynaymicArray* array = (dynaymicArray*)queue;if (array->m_size == MAX){return;}insert_dynamicArray(array, data, array->m_size);
}
//出队 头删
void pop_seqqueue(seqQueue queue)
{if (queue == NULL){return;}dynaymicArray* array = (dynaymicArray*)queue;if (array->m_size == 0){return;}remove_dynamicArray(array, 0);
}
//返回对头
void* front_seqqueue(seqQueue queue)
{if (queue == NULL){return NULL;}dynaymicArray* array = (dynaymicArray*)queue;return array->pAddr[0];
}
//返回队尾
void* back_seqqueue(seqQueue queue)
{if (queue == NULL){return NULL;}dynaymicArray* array = (dynaymicArray*)queue;return array->pAddr[array->m_size - 1];
}
int isEmpty(seqQueue queue)
{if (queue == NULL){return -1;}dynaymicArray* array = (dynaymicArray*)queue;if (array->m_size == 0){return 1;}return 0;
}
int size_seqqueue(seqQueue queue)
{if (queue == NULL){return -1;}dynaymicArray* array = (dynaymicArray*)queue;return array->m_size;
}
void destroy_seqqueue(seqQueue queue)
{if (queue == NULL){return;}// 释放动态数组的内存free(queue);                 // 释放队列的内存queue = NULL;                // 将指针置为 NULL
}
struct person
{char name[64];int age;
};
void test01()
{seqQueue myqueue = init_seqqueue();struct person p6 = { "aaa",18 };struct person p7 = { "bbb",123 };struct person p8 = { "ccc",24 };struct person p9 = { "ddd",25 };push_seqqueue(myqueue, &p6);push_seqqueue(myqueue, &p7);push_seqqueue(myqueue, &p8);push_seqqueue(myqueue, &p9);printf("大小:%d\n", size_seqqueue(myqueue));while (!isEmpty(myqueue)){struct person* p1 = (struct person*)front_seqqueue(myqueue);printf("队头名字:%s,年龄:%d\n", p1->name, p1->age);struct person* p2 = (struct person*)back_seqqueue(myqueue);printf("队尾名字:%s,年龄:%d\n", p2->name, p2->age);printf("-------\n");pop_seqqueue(myqueue);}printf("大小:%d\n", size_seqqueue(myqueue));destroy_seqqueue(myqueue); // 销毁队列
}
int main()
{test01();return 0;
}

这是.h文件

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef  struct dynaymicArray
{void** pAddr;int m_capacity;int m_size;
}dynaymicArray;
//struct person
//{
//	char name[64];
//	int age;
//};
//dynaymicArray* init_dynamicArray(int capacity);
//void insert_dynamicArray(dynaymicArray* arr, void* data, int pos);
//void foreach_dynamicArray(dynaymicArray* arr, void(*myprint)(void*));
//void remove_dynamicArray(dynaymicArray* arr, int pos);
//void removevalue_dynamicArray(dynaymicArray* arr, void* data, int(*mycompare)(void*, void*));
dynaymicArray* init_dynamicArray(int capacity)
{if (capacity <= 0){return NULL;}dynaymicArray* arr = (dynaymicArray*)malloc(sizeof(dynaymicArray));if (arr == NULL){return NULL;}arr->m_capacity = 0;arr->m_size = 0;arr->pAddr =(void**) malloc(sizeof(void*) * capacity);return arr;
}
void insert_dynamicArray(dynaymicArray* arr, void* data, int pos)
{if (data == NULL){return;}if (pos<0 || pos>arr->m_size){return;}if (arr->m_size == arr->m_capacity){int newcapacity = arr->m_capacity * 2;void** newspace =(void**) malloc(sizeof(void*) * newcapacity);memcpy(newspace, arr->pAddr, sizeof(void*) * arr->m_capacity);free(arr->pAddr);arr->pAddr = newspace;arr->m_capacity = newcapacity;}for (int i = arr->m_size - 1; i >= pos; i--){arr->pAddr[i + 1] = arr->pAddr[i];}arr->pAddr[pos] = data;arr->m_size++;
}
void foreach_dynamicArray(dynaymicArray* arr, void(*myprint)(void*))
{for (int i = 0; i < arr->m_size; i++){myprint(arr->pAddr[i]);}
}void remove_dynamicArray(dynaymicArray* arr, int pos)
{if (pos<0 || pos>arr->m_size - 1){return;}for (int i = pos; i < arr->m_size; i++){arr->pAddr[i] = arr->pAddr[i + 1];}arr->m_size--;
}
void removevalue_dynamicArray(dynaymicArray* arr, void* data, int(*mycompare)(void*, void*))
{for (int i = 0; i < arr->m_size; i++){if (mycompare(arr->pAddr[i], data)){remove_dynamicArray(arr, i);arr->m_size--;break;}}
}

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

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

相关文章

Docker的安装及使用

目录 安装Docker 安装yum工具 更新本地镜像源 安装docker 启动docker 关闭防火墙 docker启动命令 配置镜像加速 docker的使用 拉取nginx 查看本地镜像 把镜像文件nginx导出成tar文件 查看是否导出成功 ​编辑 删除本地镜像nginx:latest 导入镜像文件nginx 拉取…

Unity工具栏介绍

File 在Unity的工具栏中&#xff0c;File&#xff08;文件&#xff09;选项提供了一些重要的功能&#xff0c;使你能够管理项目和资源。以下是File选项中常见的功能&#xff1a; 1. New Project&#xff08;新建项目&#xff09;&#xff1a; 创建一个新的Unity项目。你可以…

Java项目-瑞吉外卖项目优化Day1

创建新仓库 push项目 新建分支v1.0做优化 导入Redis相关配置 导入坐标。 实现配置类&#xff0c;重写序列化器&#xff0c;也可以直接用StringRedisTemplate。 application.xml配置&#xff1a; 实现缓存短信验证码 将手机号与验证码存进redis。 从redis中获取验证码&…

微信小程序长按图片识别二维码

设置show-menu-by-longpress"true"即可&#xff0c;长按图片后会弹出一个菜单&#xff0c;若图片中包含二维码或小程序码&#xff0c;菜单中会有响应入口 <image src"图片地址" show-menu-by-longpress"true"></image>官方说明

spring 配置模型

一、引言 本文将会介绍spring的配置模型、配置初始化和动态刷新。 二、技术细节 1、配置模型 Environment ->Profile -> active / defaultMutablePropertySources -> PropertySourcer -> servlet,system,springPropertyResolver -> PropertyConvensionMutabl…

大语言模型(LLM)与 Jupyter 连接起来了!

现在&#xff0c;大语言模型&#xff08;LLM&#xff09;与 Jupyter 连接起来了&#xff01; 这主要归功于一个名叫 Jupyter AI 的项目&#xff0c;它是官方支持的 Project Jupyter 子项目。目前该项目已经完全开源&#xff0c;其连接的模型主要来自 AI21、Anthropic、AWS、Co…

专栏十六:bulk以及单细胞空转中的progeny通路分析

progeny本身有自己的R包,可以提取通路基因集信息,团队把他嵌入另一个R包decoupleR中完成富集分析。decoupleR自己有详细的针对bulk和scRNAseq的教程 简单安装一下 devtools::install_github(saezlab/OmnipathR) devtools::install_github("saezlab/progeny") Bio…

6 最大积水量

蛮力求解 #include <iostream> using namespace::std; using std::cout; using std::cin; int zdjsl(int n, int height[]) {int sum 0;int left_max[n];int right_max[n];left_max[0] height[0];right_max[n-1] height[n-1];for(int i1; i<n; i){left_max[i] m…

Python自动化测试系列[v1.0.0][单元测试框架Unittest详解]

[单元测试的含义] Unittest单元测试框架的设计灵感来源于Junit(Java语言的单元测试框架)&#xff0c;它与其他语言的单元测试框架风格相类似&#xff0c;支持自动化测试、为测试共享setUp和shutDown、它可以在将测试用例聚合到一起形成一个集合一起执行的同时在测试报告中展示…

arcmap + oracle11g 迁移数据 报错 copyFeatures失败

原因排查&#xff1a; 1.通过这个界面&#xff0c;我们无法查到真正的原因&#xff0c; 2.将数据拷贝到我们自己的arcmap服务器中&#xff0c;采用 单个要素 导入&#xff0c;从result面板中查找原因&#xff1b; 从上面这个图中&#xff0c;看到关键信息 DBMS error ORA-016…

C++ STL——栈和队列(stack queue)

本节目标 1.stack的介绍和使用及其模拟实现 2.queue的介绍和使用及其模拟实现 3.priority_queue的介绍和使用及其模拟实现 4.容器适配器 1.stack的介绍和使用及其模拟实现 1.1 stack的介绍 stack的文档介绍 根据stack的文档介绍可以知道&#xff0c;stack是一种容器适配器…

关于“Python”的核心知识点整理大全29

目录 11.2.4 方法 setUp() 注意 11.3 小结 第二部分 项目1 外星人入侵 第&#xff11;2 章 武装飞船 注意 12.1 规划项目 12.2 安装 Pygame 注意 12.2.1 使用 pip 安装 Python 包 注意 如果你启动终端会话时使用的是命令python3&#xff0c;那么在这里应使用命令…

【python VS vba】(10) 在python使用matplotlib库来画不同的图形

7 下面是不同类型的图形 6 比如 散点图 sactter import numpy as np import matplotlib.pyplot as plt# 散点图 # x, y x np.random.normal(0, 1, 20) y np.random.normal(0, 1, 20)# 绘制散点图 plt.scatter(x, y, s25, alpha0.75)plt.xlabel("X") plt.ylabel(&…

190. 字串变换(双向BFS,字符串操作,unordered_map)

190. 字串变换 - AcWing题库 已知有两个字串 A, B 及一组字串变换的规则&#xff08;至多 66 个规则&#xff09;: A1→B1 A2→B2 … 规则的含义为&#xff1a;在 A 中的子串 A1 可以变换为 B1、A2 可以变换为 B2…。 例如&#xff1a;A&#xff1d;abcd B&#xff1d;xy…

Linux多版本cuda切换

目标 将cuda版本从10.0切换为11.1 步骤 查看当前cuda版本&#xff1a; nvcc -V编辑.bashrc文件&#xff1a; vim ~/.bashrc在文件中添加以下几行&#xff08;若已存在则忽略&#xff09;&#xff1a; export PATH$PATH:/usr/local/cuda/bin export LD_LIBRARY_PATH$LD_LI…

全网好听的BGM都在这里下载,赶紧收藏好了

无论是自媒体创作者还是从事视频剪辑工作的朋友&#xff0c;对于BGM的选择都很重要&#xff0c;一首适配的BGM能大大提升你作品的质量&#xff0c;还能让作品更优秀。哪里才能找到好听又免费的BGM&#xff1f;下面推荐几个我多年收藏的6个音效、音频素材网站&#xff0c;赶紧收…

python 1200例——【1】九九乘法表

在Python中&#xff0c;你可以使用两个嵌套的for循环来打印九九乘法表。以下是一个简单的例子&#xff1a; for i in range(1, 10):for j in range(1, i1):print(f"{j}x{i}{j*i}", end"\t")print()这段代码的工作原理如下&#xff1a; 外层循环 for i in…

Netlink通信

前言 Netlink 是 Linux 内核与用户空间进程之间进行通信的机制之一,一种特殊的进程间通信(IPC) 。它是一种全双工、异步的通信机制&#xff0c;允许内核与用户空间之间传递消息。Netlink 主要用于内核模块与用户空间程序之间进行通信&#xff0c;也被一些用户空间工具用于与内…

【leetcode203】移除链表元素【Java代码讲解】

12.18 移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5]示例 2&#xff…

定制 Electron 窗口标题栏

Electron 是一款流行的桌面应用开发框架&#xff0c;基于 Web 技术构建&#xff0c;提供了强大的跨平台能力。在开发过程中&#xff0c;经常需要定制窗口标题栏以创造独特的用户体验。 1. 完全隐藏默认标题栏 有时候&#xff0c;我们希望创建一个自定义的标题栏&#xff0c;完…