链式队列总结

2023-05-16

基本数据结构之-链式队列

 

链式队列就是一个操作受到限制的单链表,学会了单链表再来写这个就是轻松加愉快,但是貌似我去用了两个小时搞定,主要是基础差!

 

队列的基本操作就是入栈和出栈,还可以看到对头和对尾

如果维护了长度参数,那么也可以返回一个长度

 

不说理论了,直接上代码吧!

 

首先定义基本数据结构的结构体:

typedef struct _LINKQUEUENODE

{

    struct _LINKQUEUENODE *next;

}LinkQueueNode;

 

typedef struct _LINKQUEUE

{

    LinkQueueNode head;

    int size;

}LinkQueue;

 

呵呵,其实和单链表的没什么区别

 

// 初始化

// 初始化

int Init_LinkQueue(void ** Queue)

{

    // 对传入的参数进行检测

    if (Queue == NULL)

        exit(-1); // 为什么不返回错误码了,初始化不成功,后面的操作都会错

 

    // 开辟一个LinkQueue结构体,

    LinkQueue *queue = (LinkQueue *)malloc(sizeof(LinkQueue));

 

    if (queue == NULL)

    {

        exit(-2);// 原因同exit(-1);

    }

 

    // 对开辟的空间的值初始化

    queue->head.next = NULL;

    queue->size = 0;

 

    // 指针间的间接赋值

    *Queue = queue;

 

    return 0;

}

接下来需要你去排队了

// 入对

int Push_LinkQueue(void * Queue, void * Data)

{

    if (Queue == NULL)

    {

        return -1;

    }

    if (Data == NULL)

    {

        return -2;

    }

   

    // 将传入的参数Queue转化为可以被我们操作的类型LinkQueue *queue,其实在传递形参时,实参就是LinkQueue *;

    LinkQueue *queue = (LinkQueue *)Queue;

    // 转化数据

    LinkQueueNode *data = (LinkQueueNode *)Data;

 

    /*

     * 这个为什么这样就可以把数据连接起来

     * 把链表头结点这边看做队列的对尾,每次入队都是对对尾的操作,

     * 我们前面是定义了一个 linkQueue 类型的结构体,里面含有有个 head ,入队就是对head指向的修改

     * 为了将 head 原来后面的数据串起来,所以首先需要用 data 的 next 域来接收head的next域

     * 最后将 head 指向 data

    */

    data->next = queue->head.next;

    queue->head.next = data;

 

    // 链式对列维护了一个长度变量,入队是长度加一

    ++ queue->size;

 

    return 0;

}

// 出队操作

int Pop_LinkQueue(void * Queue)

{

    if (Queue == NULL)

    {

        return -1;

    }

   

    LinkQueue *queue = (LinkQueue *)Queue;

   

    // 出队时,一定要检查队列的长度,当对列为空时,对对列进行出队的操作,或出BUG

    if (queue->size == 0)

    {

        return -2;

    }

   

    LinkQueueNode *pCurrent = &(queue->head);

   

    // 为什么需要检查怎么远

    /*

     * 如果只写条件 pCurrent != NULL 那么最后指针将移动到最后一个元素的后面,那么不用说,就知道会发生什么情况

     * 只检测 pCurrent->next != NULL 指针将指向最后一个元素,后面pCurrent->next = NULL或者 pCurrent = NULL;都是无用的,

     * 在讨论一下就是pCurrent->next->next != NULL的检测,这个主要是保证让指针最后停到对头的后面一个元素的位置上,保证将最后的元素指针置空

     */

    while (pCurrent != NULL && pCurrent->next != NULL && pCurrent->next->next!=NULL)

    {

        pCurrent = pCurrent->next;

    }

 

    // 将最后一个元素的前面一个元素的指针置空

    pCurrent->next = NULL;

 

    // 维护对列的长度

    -- queue->size;

   

    // 因为之后将queue->head->next 置空,而不会将queue->head置空,那么访问对列时,也可以访问一个元素

    if (queue->size == 0)

    {

        queue->head.next = NULL;

    }

 

    return 0;

}

 

我要知道队列的长度,满足您

// 返回对列的大小

int Size_LinkQueue(void * Queue)

{

    if (Queue == NULL)

    {

        return -1;

    }

 

    LinkQueue *queue = (LinkQueue *)Queue;

 

    return queue->size;

}

 

//我看这个对列不爽,我要干掉

// 销毁队列

int Destroy_LinkQueue(void * Queue)

{

    if (Queue == NULL)

        return -1;

 

    LinkQueue *queue = (LinkQueue *)Queue;

   

    // 即使知道queue不可能为空,但是还是对它做一次检测

 

    if(queue!=NULL)

     free(queue);

 

    return 0;

}

哎呀,这个对是谁在前面带队,谁在最后了???

// 返回对尾数据的指针

void* Back_LinkQueue(void * Queue)

{

    if (Queue == NULL)

        return NULL;

    LinkQueue *queue = (LinkQueue *)Queue;

    return queue->head.next;

}

// 返回队首数据的指针

void* Front_LinkQueue(void * Queue)

{

    if (Queue == NULL)

    {

        return NULL;

    }

    LinkQueue *queue = (LinkQueue *)Queue;

 

    if (queue->size == 0)

    {

        return NULL;

    }

    LinkQueueNode *pCurrent = &(queue->head);

 

    while (pCurrent != NULL && pCurrent->next != NULL)

    {

        pCurrent = pCurrent->next;

    }

    return pCurrent;

}

 

相信聪明的您已经知道怎么遍历这个队列了吧,可不是现实生活中的,你可以看一遍哈!

你需要在定义一个队列,从对头将每个数据看一遍之后再让他们去另一个队列,知道看到最后一个数据,让后把对头的指针指向新的队列,那么你就遍历了整个队列!代码就不给出了,什么不给,根本就没写!

源码在文章 http://www.cnblogs.com/bkcarlos/p/5890903.html 中提到,如果没有上传,那么可能忘记了!哈哈哈!肯定会上传的

独乐乐,不如众乐乐!

 

转载于:https://www.cnblogs.com/bkcarlos/p/5925870.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

链式队列总结 的相关文章

随机推荐

  • VS Code C++ 代码格式化方法(clang-format)

    前提条件 安装扩展C C 43 43 xff0c 扩展程序将自动安装clang format clang format默认安装路径为c Users wqr57 vscode extensions ms vscode cpptools 0 1
  • 为ubuntu服务器安装gnome图形桌面

    一般租用的服务器安装服务器版的LINUX xff0c 很少会安装桌面的 xff0c 主要是觉得浪费资源吧 xff0c 不过我这样的菜鸟还是喜欢图形桌面 xff0c 下面主要记录下这次为ubuntu 11 04版本安装GNOME xff0c
  • js表单验证 方法

    1 长度限制 lt p gt 1 长度限制 lt p gt lt form name 61 a nsubmit 61 34 return test 34 gt lt textarea name 61 34 b 34 cols 61 34 4
  • 海量数据处理之倒排索引

    前言 xff1a 本文是对博文http blog csdn net v july v article details 7085669的总结和引用 一 xff0c 什么是倒排索引 问题描述 xff1a 文档检索系统 xff0c 查询那些文件包
  • linux 服务器杀毒,一次Linux服务器***查杀经历

    1客户自己的服务器由于种了 xff0c 往外发送大量数据包 xff0c 被服务商切断网络 虽然没有网络不能直接登录服务器 xff0c 但是可以通过服务商提供的WEB控制面板进入操作系统 首先使用命令查看相关连接 xff1a netstat
  • 问题请教:关于同一个POD中多容器的广播信息问题

    广大博友好 xff0c 最近在K8S集群中遇到一个问题 xff0c 贴出来同大家分享一下 同一个POD中多个容器 如何处理广播信息 xff1f 经测试 同一个POD中当先启动的容器占用广播端口后 xff0c 其他的容器启动就会报bind e
  • JAVA在线观看视频教程完整版

    今天给大家介绍一下JAVA在线观看视频教程完整版 xff0c 我们知道Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言 xff0c 是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台
  • Dockerfile镜像的制作

    Dockerfile镜像的制作 如果学习Docker xff0c 那么制作镜像这一步肯定不能少的 xff0c 别人给你的是环境 xff0c 而你自己做的才是你最终需要的东西 xff0c 接下来就记录一下如何制作一个满足自己的镜像 xff0c
  • OpenWRT 编译教程

    1 安装Ubuntu 到 http www ubuntu org cn desktop get ubuntu download 下载 xff0c 版本随便 xff0c 我选的是10 10 32位版 安装过程就不说了 xff0c 图形化安装
  • 树莓派VNC搭建相关教程+Ubuntu16.04连接vncserver灰屏问题!

    树莓派VNC搭建相关教程 xff1a 为了节省money xff0c 于是我决定用VNC界面来代替显示器 xff0c 为后面做C 43 43 Qt以及Python Qt开发打下基础 xff0c 我别无选择 xff01 下面开始进入正题 xf
  • linux中wait系统调用

    系统中的僵尸进程都要由wait系统调用来回收 xff0c 下面就通过实战看一看wait的具体用法 xff1a wait的函数原型是 xff1a include lt sys types h gt 提供类型pid t的定义 include l
  • go 使用channel交叉打印奇偶数

    方法1 使用两个协程一个管道 xff0c 一个协程输入 xff0c 另一个协程接收 xff0c 保证i在两个协程中的值一样 package main import 34 fmt 34 34 sync 34 var wg sync WaitG
  • 事件冒泡机制和事件委派 以及回调的匿名函数参数

    1 事件冒泡机制 xff1a 事件冒泡机制也就是当一个事件绑定到一个元素上时 xff0c 如果这个元素不存在或者回调函数返回ture 那么这个事件就会向上冒泡 xff0c 继续绑定这个元素的父级元素直至document xff08 如果事件
  • Linux 内核硬件抽象

    我们结束 PCI 的讨论 通过快速看一下系统如何处理在市场上的多种 PCI 控制器 这只 是一个信息性的小节 打算来展示给好奇的读者 内核的面向对象分布如何向下扩展到最 低层 用来实现硬件抽象的机制是通常的包含方法的结构 它是一个很强功能的
  • 客户端服务器信息交互,select实现客户端和服务器端的信息交互(TCP socket)

    实现功能 xff1a 客户端 xff1a lt 1 gt 从标准输入 键盘 读入信息 xff0c 然后通过socket发送到服务器端 lt 2 gt 接收来自服务器端的信息 xff0c 并显示到终端里 服务器端 xff1a lt 1 gt
  • 软件测试人员在工作中如何运用Linux

    从事过软件测试的小伙们就会明白会使用Linux是多么重要的一件事 xff0c 工作时需要用到 xff0c 面试时会被问到 xff0c 简历中需要写到 对于软件测试人员来说 xff0c 不需要你多么熟练使用Linux所有命令 xff0c 也不
  • Ubuntu虚拟机可以上网,可以ping网络,但是无法update和install,报连接不上服务器的错误解决方案:...

    http askubuntu com questions 711889 err apt get update on ubuntu 14 04 br br br 即使给Ubuntu配置了代理 xff0c terminal能ping通网络 xf
  • JT∕T 905 -2014 出租汽车服务管理信息系统的相关协议研究

    出租汽车服务管理信息系统 xff08 JT T 905 2014 xff09 国家的相关技术要求2014年7月正式出台 xff0c 总体有四部分 xff0c 第 1 部分 xff1a 总体技术要求 xff1b 第 2 部分 xff1a 运营
  • 常用的DC插头公头的尺寸

    2 0 0 6mm xff1a 这种应该是用在诺基亚黑白屏那种手机上的充电插头 2 5 0 7mm xff1a 这种不知用在哪里 3 5 1 35mm xff1a 应该是以前那种小型的磁带机放音机上用的 4 0 1 7mm xff1a 已知
  • 链式队列总结

    基本数据结构之 链式队列 链式队列就是一个操作受到限制的单链表 xff0c 学会了单链表再来写这个就是轻松加愉快 xff0c 但是貌似我去用了两个小时搞定 xff0c 主要是基础差 xff01 队列的基本操作就是入栈和出栈 xff0c 还可