c语言的数据结构:队列

news2024/9/24 18:10:10

1.队列存在的实现方式及其存在意义

1.1为什么队列使用单链表实现更好

  1. 动态内存分配:链表在C语言中通常使用动态内存分配,这意味着可以在运行时根据需要动态地添加或删除节点。这对于实现一个动态大小的队列非常有用,因为队列的大小可以在运行时变化。相比之下,数组的大小通常是固定的,需要在编译时确定,这可能会限制队列的灵活性。
  2. 插入和删除效率:在链表中,插入和删除操作的时间复杂度为O(1)(在已知位置的情况下)。这意味着在链表的头部或尾部添加或删除节点非常高效。由于队列是一种先入先出(FIFO)的数据结构,我们通常在队列的尾部添加元素(入队),并在头部删除元素(出队)。因此,使用链表实现队列可以充分利用其高效的插入和删除操作。
  3. 空间效率:链表只存储节点本身的数据和指向下一个节点的指针,不需要像数组那样预留一定的空间。这使得链表在存储大量数据时更为空间高效.

1.2 队列存在的意义

无论是栈,队列,抑或是树,它们基本都是由顺序表,链表这些基本的元素构成的,并且人们将栈,队列等一些数据结构发明出来也是为了根据人类的需求解决人类的一些问题,举一个例子,医院叫号排队,为了防止有些人乱插队从而引起的不必要的纠纷,于是以数据结构队列为基本原理开发出有关排队就医的系统 

2.有关队列的一些基本操作如何使用c语言代码将其具现化

2.1如何写一个队列的结点

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

typedef struct Queue
{
    QNode* phead; // 指向队列头部的指针  
    QNode* ptail;  // 指向队列尾部的指针  
    int size;
} Queue;

如果只是写一个队列的结点

然后在之后的对队列的操作每次都去再设置一个头指针和尾指针如果我们需要去找队列的尾结点,那么就需要尾指针每次都从头开始去遍历整个链表的结点,但是这样做的话时间复杂度便可以来到O(n),是不合情的

所以我们在最初设置队列的结点相关基础信息的时候就连带着将它的头指针和尾指针一并设置好.

设置两个结点指针phead和ptail,例如我们每次进行一次尾插操作,就让ptail指向新的尾结点,如此一来,ptail便一直指向尾结点,每当我们需要取去寻找尾结点是,可以直接使用ptail,就不需要再去从头开始遍历了.

2.2队列的初始化操作

void QueueInit(Queue* pq)
{
    assert(pq);//pq是指向结构体的指针
    pq->phead = NULL;
    pq->ptail = NULL;
    pq->size = 0;
}

2.3队列的销毁操作

//销毁操作
void QueueDestroy(Queue* pq)
{
    assert(pq);
    QNode* cur = pq->phead;//从头开始销毁,和出队一样
    while (cur != NULL)
    {
        QNode* nexttemp = cur->next;
        free(cur);
        cur = nexttemp;
    }

    pq->phead = pq->ptail = NULL;
    pq->size = 0;
}

 QNode* nexttemp = cur->next;

这一步的意思是为了保证在将cur目前所指向的结点删除以后还可以定位到原被删除结点的下一个结点,所以事先将下一个结点cur->next用创建的临时变量nexttemp保存起来,待目前结点被删除以后,cur又快速指向下一个结点cur->next结点.

2.4入队操作

//入队
void QueuePush(Queue* pq,QDataType x)
{
    assert(pq);
    QNode* newnode = (QNode*)malloc(sizeof(QNode));
    if (newnode == NULL)
    {
        perror("malloc fail");
        return;
    }
    newnode->val = x;
    newnode->next = NULL;
    if (pq->ptail = NULL)//啥都没有
    {
        pq->ptail = pq->phead = newnode;

    }
    else//本来就有结点
    {
        pq->phead->next = newnode;
        pq->ptail = newnode;
    }
    pq->size++;
}

2.5出队操作

//出队
void QueuePop(Queue* pq)
{
    assert(pq);
    //暴力检查
    //至少要有一个结点才可以进行销毁操作

    assert(pq->phead!=NULL);
     
    if (pq->phead->next == NULL)
    {
        free(pq->phead);
        pq->phead = pq->ptail = NULL;
    }
    else
    {
        QNode* nexttemp = pq->phead->next;
        free(pq->phead);
        pq->phead = nexttemp;
    }
    pq->size--;
}

2.6取头操作

//取头
QDataType  QueueFront(Queue* pq)
{
    assert(pq);
    //要有首结点才可以进行取头操作
    assert(pq->phead != NULL);
    return pq->phead->val;
}

2.7取尾操作

//取尾
QDataType QueueBack(Queue* pq)
{
    assert(pq);
    //要有尾结点才可以进行取尾操作
    assert(pq->ptail != NULL);
    return pq->ptail->val;
}

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

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

相关文章

Matlab在同一张图中如何加入多个图例

根据代码最终画出的图片如下: 其实原理很简单,就是在一张figure中画多个坐标轴,每个坐标轴都有对应的图例,之后再将多余坐标轴隐藏,只保留一个即可。 代码如下: clear all; close all;dd_linewidth 1;a …

2024广东水展即将开幕 | 聚焦净水行业热点抢占行业新机遇

2024广东水展即将开幕 | 聚焦净水行业热点抢占行业新机遇 随着消费升级和人们对环境健康的意识增强,人们除了关注净水产品的性能外,对产品的设计、服务、多应用场景化等需求也愈发多样化。节能环保、智能化成为产品迭代升级主要方向。据奥维云网数据显示…

二叉搜索树的范围和(Lc938)——DFS

给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和。 示例 1: 输入:root [10,5,15,3,7,null,18], low 7, high 15 输出:32示例 2: 输入:root [10,5,15,3,7,13,18,1,nul…

分享Selenium测试工具用来模拟用户浏览器的操作

执行JS的类库:execjs,PyV8,selenium,node pip list pip install selenium pip install xlrd pip install xlwt pip install PyExecJS pip install xlutils selenium测试工具可以用来模拟用户浏览器的操作,其支持的浏览…

使用lnmp环境部署laravel框架需要注意的点

1,上传项目文件后,需要chmod -R 777 storage授予文件权限,不然会报错file_put_contents(/): failed to open stream: Permission denied。 如果后面还是报错没有权限的话,就执行ps -ef |grep php查询php运行用户。然后执行chown …

简单数据类型和复杂数据类型

1. 简单数据类型 null是个特例: 2. 复杂数据类型 3. 堆和栈 注意: JavaScript 中是没有堆和栈的概念的,通过堆栈的概念可以更好的理解代码的一些执行方式,便于将来学习其他语言。 4. 简单数据类型传参 总结:简单数据类型传参传…

7款炫酷的前端动画特效分享(二)(附效果图及在线演示)

分享7款好玩的前端动画特效 其中有CSS动画、SVG动画、js小游戏等等 下方效果图可能不是特别的生动 那么你可以点击在线预览进行查看相应的动画特效 同时也是可以下载该资源的 jQuery拉开帷幕特效 基于jQuery实现的帷幕特效 点击右侧拉条 可以实现帷幕的收起也展开 非常的炫酷…

【论文笔记】Dynamic Occupancy Grids for Object Detection: A Radar-Centric Approach

原文链接:https://arxiv.org/abs/2402.01488 I. 引言 感知环境在自动驾驶中非常重要,但传统的方法将这一过程分为两方面:动态物体的检测和跟踪,以及使用占用网格表达静态环境。占用网格难以表达高度动态的物体,因此动…

全国青少年软件编程(Python)等级考试试卷(一级) 测试卷2021年12月

第 1 题 【 单选题 】 下面程序的运行结果是什么?( ) a10 b5 ca*b print(c) A :10 B :15 C :50 D :5 正确答案:C 试题解析: 第 2 题 【 单选题 】 与a>b and b>c等价的是?( ) A…

第七十二天 漏洞发现-Web框架中间件联动GobyAfrogXrayAwvsVulmap

第72天 漏洞发现-Web框架中间件&联动&Goby&Afrog&Xray&Awvs&Vulmap 知识点: 1、Bup简单介绍&使用说明 2、Xray简单介绍&使用说明 3、AWWS简单介绍&使用说明 4、Goby简单介绍&使用说明 5、Afrog简单介绍&使用说明 6、…

关于编写测试用例的一些思考

测试用例是QA同学的基本功,每个人都有一套编写测试用例的体系,本文是作者结合自身的工作经验以及阅读一些测试相关的书籍后的一些看法,欢迎大家一起讨论学习。 测试设计 测试用例格式 面试中一些常见的问题 1.APP测试与服务端测试的区别&am…

【黑马程序员】5、TypeScript类型声明文件_黑马程序员前端TypeScript教程,TypeScript零基础入门到实战全套教程

课程地址:【黑马程序员前端TypeScript教程,TypeScript零基础入门到实战全套教程】 https://www.bilibili.com/video/BV14Z4y1u7pi/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 5、TypeScript类型声明文件 5.1 TS中的…

Ai-WB2-32S在window下使用vs 和 msys2编译以及烧录

文章目录 前言一、使用前准备第一步 安装vscode第二步 安装msys2 二、使用步骤1.打开MSYS2 MINGW64(1)在开始栏中找到MSYS2 MINGW64并打开(2)安装git(3)安装make(4)安装好之后的文件…

职场的过早优化

过早优化,指的是还没弄清楚需求未来的变化的走向的时候,忽略了更重要的问题。 放在职业发展上:你在没有积累足够职场资源(眼界、能力、人脉等等),也没有对职业发展形成清晰认知的时候,就过早地进…

c++基础知识补充4

单独使用词汇 using std::cout; 隐式类型转换型初始化:如A a1,,此时可以形象地理解为int i1;double ji;,此时1可以认为创建了一个值为1的临时对象,然后对目标对象进行赋值,当对象为多参数时,使用(1&#xf…

如何解决幻兽帕鲁/Palworld服务器联机游戏时的丢包问题?

如何解决幻兽帕鲁/Palworld服务器联机游戏时的丢包问题? 等待服务器维护:首先,确保网络连接稳定,然后查看游戏官方或社区论坛,了解是否有服务器维护的消息。这是解决丢包问题的一种直接且有效的方法。 更新显卡驱动&a…

Springboot接口参数校验

在设计接口时我们通常需要对接口中的非法参数做校验,以降低在程序运行时因为一些非法参数而导致程序发生异常的风险,例如登录的时候需要校验用户名密码是否为空,创建用户的时候需要校验邮件、手机号码格式是否准确。如果在代码中对接口参数一…

React之组件定义和事件处理

一、组件的分类 在react中,组件分为函数组件和class组件,也就是无状态组件和有状态组件。 * 更过时候我们应该区别使用无状态组件,因为如果有状态组件会触发生命周期所对应的一些函数 * 一旦触发他生命周期的函数,它就会影响当前项…

Linux学习笔记:进程的终止和等待

进程终止和等待 进程终止进程退出场景进程常见退出方式_exit()退出exit()退出return退出exit()与_exit()的不同之处 进程的等待什么是进程等待?为什么要进行进程等待如何进行等待wait方式:waitpid方式 进程终止 进程退出场景 一般来讲,进程的退出场景有三种: 代码运行完毕,…

chalk库的使用

这篇文章主要是对chalk库官方文档的中文翻译以及我自己的一些理解。chalk的官方文档可以看这里。 首先说下chalk库的作用:美化终端输出的文本,例如添加不同的字体颜色、不同颜色的背景、粗体以及添加下划线等等,看下图: 优点 富…