C语言-队列_c语言队列-程序员宅基地

技术标签: c语言  Powered by 金山文档  数据结构与算法  数据结构  

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

队列的特性:

  • 先进先出、后进后出。

  • 只允许 从一端 添加元素,从 另一端 删除元素。

  • 队头 出元素,队尾 进元素。

队列的顺序存储

顺序队的基本操作

顺序队的结构体定义

#define MAX 1000
typedef struct Queue{

    int data[MAX];            //顺序存储 数组模拟的队列
    int size;                //队列的大小(队列中元素的个数)

}Queue, *SeqQueue;

顺序队-初始化队

数组头做队头,数组尾做队尾。

SeqQueue init(){
    
    //申请队列空间,即数组空间
    SeqQueue p = (Queue *)malloc(sizeof(Queue));
    
    //判断队列空间申请失败
    if(!p){
        return NULL;
    }
    
    //初始化队列大小
    p->size = 0;
    
    //初始化队列值为0
    for(int i=0; i<MAX ;i++){
        p->data[i] = 0;
    }
    
    //返回队列指针
    reutrn p;
    
}

顺序队-入队

void push(SeqQueue p){
    
    //判断队列不存在
    if(!p){
        return;
    }
    
    //判断队列元素是否为满,拿队列当前的长度去跟数组的最大值作比较
    if(p->size == MAX){
        printf("队列元素已满!\n");
        return;
    }

    int value;
    printf("请输入待入队元素值:");
    scanf("%d",&value);
    
    //插入元素(进队)
    p->data[p->size] = value;
    
    //元素入队,队列长度增加
    p->size ++;
    
}

顺序队 - 出队

void push(SeqQueue p){
    
    //判断队列不存在
    if(!p){
        return;
    }
    
    //判断队列元素是否为空,拿队列当前的长度与0比较
    if(p->size == 0){
        printf("队列元素已空!\n");
        return;
    }
    
    //出队 删除数组首元素
    for(int i=0; i< p->size -1 ;i++){
        p->data[i] = p->data[i+1];
    }
    
    //元素出队,队列长度减少
    p->size --;
    
}


队列的链式存储

链队的基本操作

链队的结构体定义

//结点结构体
struct Node{

    int data;             //数据域
    struct Node* next;     //指针域

};

//队列的结构体
typedef struct LQueue{

    struct Node header;     //头结点
    int size;               //队列大小
    struct Node* pTail;     //尾结点指针

}LQueue, *LinkQueue;

链队-初始化队

LinkQueue init_LinkQueue(){

    //创建队列结构体
    struct LQueue* myQueue = (struct LQueue*)malloc(sizeof(struct LQueue));
    
    if (!myQueue){
        return NULL;
    }

    //初始化队列长度
    myQueue->size = 0;

    //初始化队列头指针的指针域
    myQueue->header.next = NULL;
    myQueue->pTail = &myQueue->header;

    return myQueue;
}

链队-入队

void push_LinkQueue(LinkQueue queue, int data){

    //本质 尾插
    if (!queue){
        return;
    }

    //创建新结点
    struct Node * newNode = (struct Node *)malloc(sizeof(struct Node));
    if (!newNode){
        return;
    }

    newNode->data = data;

    //更新指针的指向
    queue->pTail->next = newNode;
    newNode->next = NULL;
    queue->pTail = newNode;

    //更新队列大小
    queue->size++;

}

链队-出队

void pop_LinkQueue(LinkQueue queue){

    //本质头删
    if (!queue){
        return;
    }

    if (queue->size == 0){
        printf("空队,无法出队\n");
        return;
    }

    //记录第一个结点
    struct Node* pFirst = queue->header.next;

    //更新指针的指向
    queue->header.next = pFirst->next;

    //判断结点存在并释放结点
    if (pFirst){
        free(pFirst);
    }

    //队列中只有一个结点的时候,再出队会影响尾指针,需要特判
    if (queue->size == 1){
        queue->pTail = &queue->header;
    }

    //队列大小更新
    queue->size--;

}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Discod_lim/article/details/129695360

智能推荐

大象机器人开源六轴协作机械臂myCobot 320 手机摄影技术!

这些问题标志着我后续研究的重点方向,需要我继续深入学习AVFoundation框架的使用,特别是其控制摄像头的具体方法,并探索如何将这些控制整合到机械臂的运动调整中,以确保最终拍摄出的视频质量符合预期。尽管目前市场上有许多稳定设备如平衡环架(gimbal)来辅助拍摄,以求达到稳定和多角度的拍摄效果,但在此篇文章中,我将探索一种独特的解决方案:通过将手机安装在机械臂的末端来进行拍摄,以实现那些传统方法难以捕捉的特殊视角。随着人工智能技术的不断进步和普及,AI与机器人的结合无疑将成为未来技术发展的重要趋势。

【计算机毕业设计】springboot党员之家服务系统小程序-程序员宅基地

文章浏览阅读342次,点赞6次,收藏8次。党员之家服务系统小程序的功能已基本实现,主要包括首页、个人中心、学生管理、教师管理、任务信息管理、报名信息管理、任务排名管理、学习资料管理、每日打卡管理、交流信息管理、回复信息管理、积极分子管理、党员信息管理、交流论坛、系统管理等。论文主要从系统的分析与设计 、数据库设计和系统的详细设计等几个方面来进行论述,系统分析与设计部分主要论述了系统的功能分析、系统的设计思路,数据库设计主要论述了数据库的设计,系统的详细设计部分主要论述了几个主要模块的详细设计过程。

Failed to discover available identity versions when contacting http://controller:35357/v3. 错误解决方式_caused by newconnectionerror('<urllib3.connection.-程序员宅基地

文章浏览阅读8.3k次,点赞5次,收藏12次。作为 admin 用户,请求认证令牌,输入如下命令openstack --os-auth-url http://controller:35357/v3 --os-project-domain-name default --os-user-domain-name default --os-project-name admin --os-username admin token issue报错Failed to discover available identity versions whe._caused by newconnectionerror('

学校机房统一批量安装软件的方法来了_教室电脑 一起装软件-程序员宅基地

文章浏览阅读4.5k次。​可以在桌面安装云顷还原系统软件,利用软件中的网络对拷功能部署批量对拷环境,进行电脑教室软件的批量对拷安装与增量对拷安装。​_教室电脑 一起装软件

消息队列(kafka/nsq等)与任务队列(celery/ytask等)到底有什么不同?_任务队列和消息队列-程序员宅基地

文章浏览阅读3.1k次,点赞5次,收藏7次。原文链接:https://www.ikaze.cn/article/43写这篇博文的起因是,我在论坛宣传我开源的新项目YTask(go语言异步任务队列)时,有小伙伴在下面回了一句“为什么不用nsq?”。这使我想起,我在和同事介绍celery时同事说了一句“这不就是kafka吗?”。那么YTask和nsq,celery和kafka?他们之间到底有什么不同呢?下面我结合自己的理解。简单的分析一..._任务队列和消息队列

Java调KT类_java 调用kt 对象-程序员宅基地

文章浏览阅读1.5k次。1,MyUtuils.kt将被调用的文件class MyUtils { fun show(info:String){ println(info) }}fun show(info:String){ println(info)}2,Java文件调用该类,ClientJava.javapublic class ClientJava { public static void main(String[] args) { /** _java 调用kt 对象

随便推点

Matplotlib.pyplot库引入失败?_如何导入 matplotlib.pyplot 导入失败-程序员宅基地

文章浏览阅读174次。用Python的人总少不了与Matplotlib接触,可是我们在引入时Python少不了报错。此时,我们就需要在错误中寻找线索。_如何导入 matplotlib.pyplot 导入失败

uni-app,uni-table表格操作_uniapp table-程序员宅基地

文章浏览阅读8.5k次,点赞2次,收藏11次。使用uni-ui UI框架实现表格加分页功能,uni-table 和uni-pagination 组件的使用示例加完整代码。_uniapp table

HTML5本地存储账号密码

【代码】HTML5本地存储账号密码。

vue.js知识点-transition的钩子函数应用(实例展示)_transition 钩子-程序员宅基地

文章浏览阅读1.6k次。本小结通过transition的钩子函数实现小球半场动画头条-静敏的编程秘诀-vue教程合集知识点1:入场、出厂方法beforeEnter表示动画入场之前,此时,动画尚未开始,可以在beforeEnter中设置元素开始动画之前的起始样式enter表示动画开始之后的样式,这里可是设置小球完成动画之后的,结束状态enter(el,done)el:动画钩子函数的第一个参数:el,..._transition 钩子

MyBatis 多表映射及动态语句

主要梳理mybatis多表及动态使用

Qt 多线程基础及线程使用方式-程序员宅基地

文章浏览阅读2.9w次,点赞98次,收藏777次。文章目录Qt 多线程操作2.线程类QThread3.多线程使用:方式一4.多线程使用:方式二5.Qt 线程池的使用Qt 多线程操作应用程序在某些情况下需要处理比较复杂的逻辑, 如果只有一个线程去处理,就会导致窗口卡顿,无法处理用户的相关操作。这种情况下就需要使用多线程,其中一个线程处理窗口事件,其他线程进行逻辑运算,多个线程各司其职,不仅可以提高用户体验还可以提升程序的执行效率。Qt中使用多线程需要注意:Qt的默认线程为窗口线程(主线程):负责窗口事件处理或窗口控件数据的更新;子线程负责后台的业_qt 多线程

推荐文章

热门文章

相关标签