追梦之旅【数据结构篇】——详解C语言实现链队列

news2024/12/23 19:09:57

详解C语言实现链队列~😎

  • 前言🙌
  • 整体实现内容分析💞
  • 预备小知识🙌
    • 1.链队列头文件编写🙌
    • 2.链队列功能文件(Queue.c )编写:🙌
      • 1)初始化函数实现
      • 2)销毁函数实现
      • 3)队尾插入元素函数实现
      • 4)队头删除元素函数实现
      • 5)获取队头元素函数实现
      • 6)获取队尾元素函数实现
      • 7)获取队列元素个数的函数实现
      • 8)判空函数实现
    • 3.链队列测试文件编写🙌
  • 总结撒花💞

追梦之旅,你我同行

   
😎博客昵称:博客小梦
😊最喜欢的座右铭:全神贯注的上吧!!!
😊作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主!

😘博主小留言:哈喽!😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不多说,文章推上!欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘
在这里插入图片描述

前言🙌

    哈喽各位友友们😊,我今天又学到了很多有趣的知识现在迫不及待的想和大家分享一下!😘我仅已此文,手把手带领大家详解C语言实现链队列~ 结合链表的相关算法,根据队列先进先出的结构特点,实现我们链队列。都是精华内容,可不要错过哟!!!😍😍😍

整体实现内容分析💞

首先先编写我们的Queue.h文件的内容,将需要的头文件和需要实现的功能函数做个声明。然后是Queue.c文件的编写,主要是针对各个功能函数的一一实现,最后是Test.c文件的编写,测试我们功能函数是否有问题。

预备小知识🙌

队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。

队列的结构示意图:

在这里插入图片描述

1.链队列头文件编写🙌

头文件的编写的整体思路分析:

这里是有关头文件的编写和各种功能函数的声明,首先用typedef关键字给存储数据类型取别名,这样做的好处是以后想要改变队列的数据类型只需修改typedef int QDataType;里的int即可。定义一个结构体,包括next指针和data。然后是各个功能函数声明

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>

typedef int QDataType;
typedef struct QueueNode
{
	struct QueueNode* next;
	QDataType data;
}QNode;

typedef struct Queue
{
	QNode* head;
	QNode* tail;
}Queue;
//初始化
void QueueInit(Queue* pq);
//销毁
void QueueDestory(Queue* pq);
//队尾入
void QueuePush(Queue* pq, QDataType);
//队头出
void QueuePop(Queue* pq);
//队头元素
QDataType QueueFront(Queue* pq);
//队尾元素
QDataType QueueBack(Queue* pq);
//队列元素个数
int QueueSize(Queue* pq);
//判空
bool QueueEmpty(Queue* pq);

2.链队列功能文件(Queue.c )编写:🙌

1)初始化函数实现

编写的整体思路分析:

先用assert确保pq指针的有效性,然头尾指针置为空。

//初始化
void QueueInit(Queue* pq)
{
	assert(pq);
	pq->head = pq->tail = NULL;
}

2)销毁函数实现

编写的整体思路分析:

先用assert确保pq指针的有效性,先定义一个指针cur记录head指针的位置,然后用while循环进行一个个删除:先定义一个next指向cur指针指向的下一个队列元素,然后删掉cur指向的元素,再让cur移动到下一个。

//销毁
void QueueDestory(Queue* pq)
{
	assert(pq);
	QNode* cur = pq->head;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->head = pq->tail = NULL;

}

3)队尾插入元素函数实现

编写的整体思路分析:

先用assert确保pq指针的有效性,用malloc函数申请空间,用if语句来判断空间是否开辟失败。然后让newnode->next置为空,把数据放进去。如果是一开始时为空的,则让pq->head = pq->tail = newnode;如果不为空,则让之前的tail指向的节点与新节点相连。

//队尾入
void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		printf("malloc fail\n");
		exit(-1);
	}
	newnode->data = x;
	newnode->next = NULL;
	if (pq->tail == NULL)
	{
		pq->head = pq->tail = newnode;
	}
	else
	{
		pq->tail->next = newnode;
		pq->tail = newnode;

4)队头删除元素函数实现

编写的整体思路分析:

用assert确保pq指针的有效性,如果队列为空,就不用进行队头出的操作,如果执行则报错。先用next指针指向首结点的下一个节点 。然后删掉首节点,再让head指针指向next位置。删完后,将尾指针置为NULL

//队头出
void QueuePop(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	QNode* next = pq->head->next;
	free(pq->head);
	pq->head = next;
	if (pq->head == NULL)
	{
		pq->tail = NULL;
	}
}

5)获取队头元素函数实现

编写的整体思路分析:

先用assert确保pq指针的有效性,如果队列为空,就不用进行此操作。然后直接返回首节点数据即可。

//队头元素
QDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return pq->head->data;
}

6)获取队尾元素函数实现

编写的整体思路分析:

先用assert确保pq指针的有效性,如果队列为空,就不用进行此操作。然后直接返回尾节点数据即可。

//队尾元素
QDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return pq->tail->data;

}

7)获取队列元素个数的函数实现

编写的整体思路分析:

先用assert确保pq指针的有效性,定义cur指向head的位置。利用while循环,先让Size加1,然后让cur指向下一个,知道cur为空时结束循环,返回Size大小就是队列元素的个数。

//队列元素个数
int QueueSize(Queue* pq)
{
	assert(pq);
	int Size = 0;
	QNode* cur = pq->head;
	while (cur)
	{
		Size++;
		cur = cur->next;
		return Size;
	}
}

8)判空函数实现

编写的整体思路分析:

先用assert确保pq指针的有效性,然后pq->head == NULL为真,则返回1,为假则返回0;

//判空
bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->head == NULL;
}

3.链队列测试文件编写🙌

3)Tese.c文件的编写。
#define _CRT_SECURE_NO_WARNINGS 1
#include"Queue.h"
void test()
{
	Queue q;
	QueueInit(&q);
	QueuePush(&q, 1);
	QueuePush(&q, 2);
	QueuePush(&q, 3);
	QueuePush(&q, 4);
	printf("队首元素:%d\n", QueueFront(&q));
	printf("队尾元素:%d\n", QueueBack(&q));
	printf("队列元素的个数:%d\n", QueueBack(&q));
	printf("队列元素输出:");
	while (!QueueEmpty(&q))
	{
		QDataType* front = QueueFront(&q);
		printf("%d", front);
		QueuePop(&q);
	}
	printf("\n");
	QueueDestory(&q);
}
int main()
{
	test();

	return 0;
}

功能测试结果展示图:
在这里插入图片描述

总结撒花💞

   本篇文章旨在分享详解C语言实现链队列。希望大家通过阅读此文有所收获本次关于队列的实现相对于之前链表和顺序表的实现简单一点,实现起来的算法和之前的栈是相似的,但结构特点与栈是相反的。指针的指向没有那么复杂,主要是对入队列和出队列的功能实现。但也有很多地方需要注意的。比如说,野指针的问题,动态开辟的空间一定要free掉,并且把指针置为NULL。用动态实现,相对于静态实现还比较灵活,也能对空间有很大的节省。
   😘如果我写的有什么不好之处,请在文章下方给出你宝贵的意见😊。如果觉得我写的好的话请点个赞赞和关注哦~😘😘😘

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

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

相关文章

【一些回忆】2022.02.26-2023.02.26 一个普通男孩的365天

&#x1f483;&#x1f3fc; 本人简介&#xff1a;男 &#x1f476;&#x1f3fc; 年龄&#xff1a;18 &#x1f91e; 作者&#xff1a;那就叫我亮亮叭 &#x1f4d5; 专栏&#xff1a;一些回忆 为什么选择在这个时间节点回忆一下呢&#xff1f; 一是因为今天距离2023高考仅剩1…

华为OD机试题,用 Java 解【删除字符串中出现次数最少的字符】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…

Linux内核内存相关问题,这一篇让你彻底了解

linux 内存是后台开发人员&#xff0c;需要深入了解的计算机资源。合理的使用内存&#xff0c;有助于提升机器的性能和稳定性。本文主要介绍 linux 内存组织结构和页面布局&#xff0c;内存碎片产生原因和优化算法&#xff0c;linux 内核几种内存管理的方法&#xff0c;内存使用…

排错工具ping和trace(电子科技大学TCP/IP实验四)

一&#xff0e;实验目的 1、了解网络连通性测试的方法和工作原理 2、了解网络路径跟踪的方法和工作原理 3、掌握 MTU 的概念和 IP 分片操作 4、掌握 IP 分组生存时间&#xff08;TTL&#xff09;的含义和作用 5、掌握路由表的作用和路由查找算法 二&#xff0e;预备知识 …

[SQL Statements] 基本的SQL知识 之DDL针对数据库的基本操作

SQL Statements SQL语句的学习 之 DDL针对数据库的基本操作 什么是database 在 MySQL 中&#xff0c;Database&#xff08;数据库&#xff09;是一组有组织的数据集合&#xff0c;可以存储和管理相关数据的容器。一个数据库可以包含多个表&#xff08;Table&#xff09;&…

如何用 chatGPT,给大家来一个自我介绍

大家好&#xff0c;我是不吃西红柿的无线机械键盘&#xff0c;我的名字叫 Keychron K3 Pro。今天&#xff0c;我通过西红柿主人的手&#xff0c;使用 chatGPT 来介绍一下我自己。我的与众不同 我是由精密机械元件制作而成&#xff0c;并采用抗键渗设计&#xff0c;以提供更快、…

电子科技大学网络协议(TCP/IP作业答案)--网工(五次作业汇总)

目录 作业1&#xff1a;OSI/RM、TCP/IP编址和底层网络技术 作业2&#xff1a;IP地址规划与路由选择 作业3&#xff1a;ARP、IP、ICMP 作业4&#xff1a;UDP、Routing Protocol 作业五 作业1&#xff1a;OSI/RM、TCP/IP编址和底层网络技术 物理地址属于OSI/RM的哪一层&…

关于Linux内存管理的详细介绍,这篇万字长文值得你的收藏点赞

Linux内存管理一、Linux内存管理概述1.1 什么是内存管理1.2 内存管理的重要性1.3 内存管理的组成部分二、物理内存管理2.1 什么是物理内存2.2 物理内存管理方式2.2.1 连续内存管理2.2.2 非连续内存管理2.3 物理内存管理相关的函数及示例三、虚拟内存管理3.1 什么是虚拟内存3.2 …

HTML常用基础内容总结

文章目录一、对HTML的感性认知前置知识什么是web前端&#xff0c;什么是web后端前端技术栈、后端技术栈开发与运行的区别浏览器的功能是什么简介写一个简单可运行的的html代码前端开发方式二、VSCode的简单使用三、常用的HTML标签最最基本的HTML结构HTML代码特点注释标签标题标…

「JVM 高效并发」Java 内存模型

Amdahl 定律代替摩尔定律成为了计算机性能发展的新源动力&#xff0c;也是人类压榨计算机运算能力的最有力武器&#xff1b; 摩尔定律&#xff0c;描述处理器晶体管数量与运行效率之间的发展关系&#xff1b;Amdahl 定律&#xff0c;描述系统并行化与串行化的比重与系统运算加…

这9道软件测试面试题,就能刷掉90%的软件测试员

转眼就要到“金三银四”了&#xff0c;没点真本事真技术&#xff0c;没点面试经验&#xff0c;不了解点职场套路&#xff0c;如何过五关斩六将&#xff1f;如何打败面试官&#xff1f;如何拿下那梦寐以求的offer&#xff1f; 如果你的跳槽意向已经很确定&#xff0c;那么请往下…

【python量化】大幅提升预测性能,将NSTransformer用于股价预测

写在前面NSTransformer模型来自NIPS 2022的一篇paper《Non-stationary Transformers: Exploring the Stationarity in Time Series Forecasting》。NSTransformer的目的主要是为了解决其他方法出现过平稳化处理的问题。其通过提出序列平稳化以及去平稳化注意力机制可以使得模型…

我眼中的柔宇科技

关注、星标公众号&#xff0c;直达精彩内容来源&#xff1a;技术让梦想更伟大作者&#xff1a;李肖遥很早就知道了柔宇科技&#xff0c;当时是因为知道创始人刘自鸿&#xff0c;23岁清华本硕毕业&#xff0c;26岁获斯坦福大学电子工程博士学位&#xff0c;历时不超过3年&#x…

你真的了解环形队列吗?(学习数据结构必须掌握的模型)

目录 0.前言 1. 什么是环形队列 2. 如何使用数组结构 / 链表结构 对环形队列封装 3. 代码手撕环形队列各个接口 3.1 代表封装一个环形队列 3.2 环形队列的初始化 3.3 环形队列的插入 3.4环形队列的删除 3.5环形队列的判空 3.6环形队列的判满 3.7环形队列的队头 3.8环…

NCNN量化详解2

1 NCNN量化算法简介 量化算法介绍的文章的话,下面这篇文章的大佬 @章小龙 介绍的比我好多啦。虽然介绍的是NVIDIA TensorRT的算法,但是NCNN是参考其算法做出来的,方法几乎一样 首先NVIDIA有一个PPT,很好的阐述了他们的方案,推荐大家也去看一下: https://link.zhihu.com…

我来了,RK第七届开发者大会

大家好&#xff0c;我是发哥的朋友windsnake「也是发哥文章里面经常出现的邓总」。今年终于是有时间参加了一次Rk的开发者大会&#xff0c;这篇文章记录下自己的所见所闻&#xff0c;算是对自己福州之行的一次总结。从深圳出发月亮还没睡醒的早上&#xff0c;坐5号线杀到深圳北…

【项目设计】高并发内存池(二)[高并发内存池整体框架设计|threadcache]

&#x1f387;C学习历程&#xff1a;入门 博客主页&#xff1a;一起去看日落吗持续分享博主的C学习历程博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 也许你现在做的事情&#xff0c;暂时看不到成果&#xff0c;但不要忘记&…

【无标题String、StringBuffer、StringBuilder区别】

一、背景。 这篇文章主要介绍了String、StringBuffer、StringBuilder的区别详细教程,本文通过图文并茂的形式给大家介绍的非常详细&#xff0c;对大家的学习或工作具有一定的参考借鉴价值&#xff0c;需要的朋友可以参考下。放假在家里休息&#xff0c;闲来无事&#xff0c;想…

华为OD机试题,用 Java 解【汽水瓶】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…

【华为OD机试模拟题】用 C++ 实现 - 寻找路径 or 数组二叉树(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 获得完美走位(2023.Q1) 文章目录 最近更新的博客使用说明寻找路径 or 数组二叉树题目输入输出描述示例一输入输出示例二输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过…