当前位置: 首页 > news >正文

数据结构 day05

数据结构 day05

  • 5. 队列
    • 5.3. 链式队列
      • 5.3.1. 特征
      • 5.3.2. 代码实现
  • 6. 双向链表
    • 6.1. 特性
      • 6.2. 代码实现

5. 队列

5.3. 链式队列

5.3.1. 特征

逻辑结构:线性结构
存储结构:链式存储
操作:创建、入列、出列、判空、清空

5.3.2. 代码实现

头文件:linkqueue.h

#ifndef __LINKQUEUE_H__
#define __LINKQUEUE_H__
typedef int datatype;
typedef struct node_t
{datatype data;struct node_t *next;
} linkqueue_node_t, *linkqueue_list_t;typedef struct // 将队列头指针和尾指针封装到一个结构体里
{linkqueue_list_t front; // 相当于队列的头指针linkqueue_list_t rear;  // 相当于队列的尾指针// 有了链表的头指针和尾指针,那么我们就可以操作这个链表
} linkqueue_t;
//1.创建一个空的队列,用有头链表。
linkqueue_t *createEmptyLinkQueue();
//2.入列 data代表入列的数据
int inLinkQueue(linkqueue_t *p, datatype data);
// 3. 出列
//思想:每次释放front所指节点,然后移动front到后一个节点返回当前节点数据
datatype outLinkQueue(linkqueue_t *p);
//4.判断队列是否为空
int isEmptyLinkQueue(linkqueue_t *p);
//5.求队列长度的函数
int lengthLinkQueue(linkqueue_t *p);
//6.清空队列
void clearLinkQueue(linkqueue_t *p);
#endif
  1. 创建一个空的队列,用有头链表。
linkqueue_t *createEmptyLinkQueue();
{// 申请空间存放队列结构linkqueue_list_t q = (linkqueue_list_t)malloc(sizeof(linkqueue_node_t));if (q == NULL){printf("Space opening failure!!\n");return -1;}// 初始化q->next = NULL;// 申请空间存放头尾指针linkqueue_t *p = (linkqueue_t*) malloc(sizeof(linkqueue_t));if(p == NULL){printf("Space opening failure!!\n");free(q);return -1;}// 初始化p->front = q;p->rear = q;return p;
}
  1. 入列
int inLinkQueue(linkqueue_t *p, datatype data);
{// 开辟空间存放新节点,定义指针pnew指向新节点linkqueue_list_t pnew = (linkqueue_list_t)malloc(sizeof(linkqueue_node_t));// 容错判断if(pnew == NULL){printf("Space opening failure!!\n");return -1;}// 新节点初始化pnew->data = data;pnew->next = NULL;// 链接新节点p->rear->next = pnew;// 尾指针移动p->rear = pnew;return 0}
  1. 出列, 每次释放front所指下一个节点,然后移动front到后一个节点返回当前节点数据
datatype outLinkQueue(linkqueue_t *p);
{// 容错判断if(isEmptyLinkQueue(p)){printf("Linkqueue is empty!!\n");return -1;}// 定义指针pdel,指向被删除节点linkqueue_list_t pdel = p->front->next;// 定义变量,暂存出列数据datatype data = pdel->data;// 删除节点p->front->next = pdel->next;free(pdel);pdel = NULL;// 出列完成后,如果队列为空,那么召回rearif(p->front == NULL)p->rear = p->front;// 返回出列数据return data;
}
  1. 判断队列是否为空
int isEmptyLinkQueue(linkqueue_t *p);
{// 以队列的特性呈现return p->rear == p->front;
}

也可以使用p->front->next == NULL;来作为判断队列为空的条件,但这是链表特性的内容,作为队列的操作内容,尽量以队列的特性呈现

  1. 求队列长度的函数
int lengthLinkQueue(linkqueue_t *p);
{// 定义变量存放长度int len =0;// 定义头指针,头指针遍历链表linkqueue_list_t h = p->front;// 遍历链表while(h->next == NULL){h = h->next;len ++;}return len;
}

多定义一个头指针的原因:通过地址找到的front,所以对于front来说,相当于地址传递,所以改变front的指向会影响队头的值

  1. 清空队列
void clearLinkQueue(linkqueue_t *p);
{while(!isEmptyLinkQueue(p))outLinkQueue(p);
}

6. 双向链表

6.1. 特性

逻辑特性:线性结构
存储结构:链式存储
操作:增删改查
创建:模仿链式队列的形式创建
双向链表的创建结构图

6.2. 代码实现

头文件 doublelinklist.h

#ifndef __DOUBLELINKLIST_H__
#define __DOUBLELINKLIST_H__// 双向链表的节点定义typedef int datatype;
typedef struct node_t
{datatype data;        // 数据域struct node_t *next;  // 指向下一个节点的指针 next 先前的struct node_t *prior; // 指向前一个节点的指针 prior 下一个
} link_node_t, *link_node_p;// 将双向链表的头指针和尾指针封装到一个结构体里
// 思想上有点像学的链式队列
typedef struct doublelinklist
{link_node_p head; // 指向双向链表的头指针link_node_p tail; // 指向双向链表的尾指针int len;          // 用来保存当前双向链表的长度
} double_list_t, *double_list_p;//1.创建一个空的双向链表
double_list_p createEmptyDoubleLinkList();
// 2.向双向链表的指定位置插入数据 post位置, data数据
int insertIntoDoubleLinkList(double_list_p p, int post, datatype data);
// 3.遍历双向链表
void showDoubleLinkList(double_list_p p);
// 4.判断双向链表是否为空
int isEmptyDoubleLinkList(double_list_p p);
// 5.删除双向链表指定位置数据
int deletePostDoubleLinkList(double_list_p p, int post);
//6.求双向链表的长度
int lengthDoubleLinkList(double_list_p p);
//7.查找指定数据出现的位置 data被查找的数据
int searchPostDoubleLinkList(double_list_p p,datatype data);
//8.修改指定位置的数据,post修改的位置 data被修改的数据
int changeDataDoubleLinkList(double_list_p p,int post, datatype data)
// 9.删除双向链表中的指定数据 data代表删除所有出现的data数据
void deleteDataDoubleLinkList(double_list_p p, datatype data)#endif
  1. 创建一个空的双向链表
double_list_p createEmptyDoubleLinkList()
{// 申请空间存放头尾指针double_list_p p = (double_list_p)malloc(sizeof(double_list_t));if (p == NULL){printf("Space opening failure!!\n");return NULL;}// 申请空间存放头节点link_node_p ph = (link_node_p)malloc(sizeof(link_node_t));if (ph == NULL){printf("Space opening failure!!\n");free(p);p = NULL;return NULL;}// 头尾指针初始化,头节点初始化p->head = ph;p->tail = ph;p->len = 0;ph->next = NULL;ph->prior = NULL;return p;
}
  1. 向双向链表的指定位置插入数据 post位置, data数据
int insertIntoDoubleLinkList(double_list_p p, int post, datatype data)
{// 容错判断if (post < 0 || post > p->len){printf("post is err!!\n");return -1;}// 定义temp暂存head或taillink_node_p temp = NULL;// 定义pnew指向被插入节点link_node_p pnew = (link_node_p)malloc(sizeof(link_node_t));// 初始化pnew->data = data;pnew->prior = NULL;pnew->next = NULL;// 判断插入位置在前半段还是后半段if (post < p->len / 2){temp = p->head;for (int i = 0; i < post; i++)temp = temp->next;}else{temp = p->tail;for (int i = p->len - 1; i > post; i--)temp = temp->prior;}// 建立链接pnew->next = temp->next;pnew->prior = temp;temp->next = pnew;if (post == p->len)// 尾指针移动p->tail = pnew;elsepnew->next->prior = pnew;// 长度+1p->len++;
}
  1. 遍历双向链表
void showDoubleLinkList(double_list_p p)
{// 定义h,代替head移动遍历link_node_p temp = NULL;printf("正向遍历:");temp = p->head;while (temp->next != NULL){temp = temp->next;printf("%-4d", temp->data);}printf("\n");printf("反向遍历:");temp = p->tail;while (temp != p->head){printf("%-4d", temp->data);temp = temp->prior;}printf("\n");
}
  1. 判断双向链表是否为空
int isEmptyDoubleLinkList(double_list_p p)
{return p->len == 0;
}
  1. 删除双向链表指定位置数据
int deletePostDoubleLinkList(double_list_p p, int post)
{// 容错判断if (isEmptyDoubleLinkList(p) || post < 0 || post > p->len - 1){printf("deletePostDoubleLinkList err");return -1;}// 定义一个pdel指向被删除节点link_node_p pdel = NULL;// 判断前半段还是后半段if (post < p->len / 2){pdel = p->head;for (int i = 0; i <= post; i++)pdel = pdel->next;}else{pdel = p->tail;for (int i = p->len - 1; i >= post; i--)pdel = pdel->prior;}// 删除操作pdel->prior->next = pdel->next;if (pdel->next == NULL)p->tail = pdel->prior;elsepdel->next->prior = pdel->prior;return 0;
}
  1. 求双向链表的长度
int lengthDoubleLinkList(double_list_p p)
{return p->len;
}
  1. 查找指定数据出现的位置 data被查找的数据
// 7.查找指定数据出现的位置 data被查找的数据
int searchPostDoubleLinkList(double_list_p p, datatype data)
{// 定义temp指向头指针,代替头指针移动link_node_p temp = p->head;// 定义变量post,保存位置int post = 0;while (temp->next == NULL){temp = temp->next;if (temp->data == data)return post;post++;}return -1;
}
  1. 修改指定位置的数据,post修改的位置 data被修改的数据
int changeDataDoubleLinkList(double_list_p p,int post, datatype data)
{// 容错判断if (isEmptyDoubleLinkList(p) || post < 0 || post > p->len - 1){printf("changeDataDoubleLinkList err");return -1;}// 定义一个temp,代替头尾指针移动link_node_p temp = NULL;if (post < p->len / 2){temp = p->head;for (int i = 0; i <= post; i++)temp = temp->next;}else{temp = p->tail;for (int i = p->len - 1; i >= post; i--)temp = temp->prior;}// 修改数据temp->data = data;return 0;
}
  1. 删除双向链表中的指定数据 data代表删除所有出现的data数据
void deleteDataDoubleLinkList(double_list_p p, datatype data)
{// 定义pdel遍历,暂存被删除节点link_node_p pdel = p->head->next;// 遍历链表,直到pdel指向最后一个节点时停止while (pdel == p->tail){if (pdel->data == data){pdel->prior->next = pdel->next;pdel = pdel->prior;free(pdel->next->prior);pdel->next->prior = pdel;p->len--;}pdel = pdel->next;}// 判断最后一个节点数据是否匹配,匹配删除,不匹配就结束遍历if (pdel->data == data){p->len--;p->tail = pdel->prior;p->tail->next = NULL;free(pdel);}pdel = NULL;
}

从头节点后节点开始用指针pdel遍历,相当于遍历无头链表,遇到需要删除节点的就用pdel指向它然后删除,如果不需要删除则pdel继续往后走一个节点。

相关文章:

数据结构 day05

数据结构 day05 5. 队列5.3. 链式队列5.3.1. 特征5.3.2. 代码实现 6. 双向链表6.1. 特性6.2. 代码实现 5. 队列 5.3. 链式队列 5.3.1. 特征 逻辑结构&#xff1a;线性结构 存储结构&#xff1a;链式存储 操作&#xff1a;创建、入列、出列、判空、清空 5.3.2. 代码实现 头文…...

股票数据接口API实例代码python、JAVA等多种语言演示免费获取实时数据、历史数据、CDMA、KDJ等指标数据配有API说明文档

​ 本文中所有接口均可直接在浏览器打开获取数据&#xff0c;为了便于大家验证有效性&#xff0c;已经做好了超链接&#xff0c;直接点击即可&#xff01; 沪深两市股票列表 API接口链接&#xff08;可点击验证&#xff09;&#xff1a;https://api.mairui.club/hslt/list/b…...

【Map vs Set】:Java数据存储的“双子星”对决

个人主页&#xff1a;♡喜欢做梦 欢迎 &#x1f44d;点赞 ➕关注 ❤️收藏 &#x1f4ac;评论 目录 &#x1f370;一、搜索 &#x1f36e;1.概念 &#x1f36e;2.模型 &#x1f370;二、Map &#x1f368;1.什么是Map&#xff1f; &#x1f368;2.Map的实例化 &…...

ollama+langchain+deepseek本机跑通大模型

一、部署deepseek Ollama&#xff0c;这是是一个开源的大语言模型平台&#xff0c;它允许用户在本地环境中运行、创建和共享大型语言模型。Ollama提供了丰富的功能和特性&#xff0c;使得用户可以在自己的计算机上轻松地部署和运行大型语言模型。官网&#xff1a;https://ollam…...

03【FreeRTO队列-如何获取任务信息与队列的动静态创建】

一.利用 vTaskList()以及 vTaskGetRunTimeStats()来获取任务的信息 1.现象与开启启用宏 freeRTOSConfig.h //必须启用 #define configUSE_TRACE_FACILITY 1 #define configGENERATE_RUN_TIME_STATS 1 #define configUSE_STATS_FORMATTING_FUNCTIONS…...

vue-plugin-hiprint (vue2

页面效果 <template><div><div class="d-flex flex-column mt5"><div class="d-flex flex-row " style="margin-bottom: 10px;justify-content: center;"><!-- 纸张大小 A3、A4 等 --><div class="paper…...

【后端面试总结】什么是堆,什么是栈

堆与栈&#xff1a;计算机科学中的两大内存管理利器 在计算机科学中&#xff0c;内存管理是软件开发的核心组成部分之一。其中&#xff0c;堆&#xff08;Heap&#xff09;和栈&#xff08;Stack&#xff09;是两种最基本的内存分配方式&#xff0c;它们各自有着独特的特性和应…...

第39周:猫狗识别 2(Tensorflow实战第九周)

目录 前言 一、前期工作 1.1 设置GPU 1.2 导入数据 输出 二、数据预处理 2.1 加载数据 2.2 再次检查数据 2.3 配置数据集 2.4 可视化数据 三、构建VGG-16网络 3.1 VGG-16网络介绍 3.2 搭建VGG-16模型 四、编译 五、训练模型 5.1 上次程序的主要Bug 5.2 修改版…...

力扣--239.滑动窗口最大值

问题 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xff1a;nums [1,3,-1,-3,5,3,6,7], …...

傅里叶变换推导

基本模型 假设在二维直角坐标系中&#xff0c;可以用相互垂直的基向量和表示&#xff1a; 假设&#xff1a; 假设在上的投影为&#xff0c;那么&#xff1a; 所以&#xff1a; 用公式表达&#xff1a; 但是在实际中&#xff0c;基向量和不一定长度都是1&#xff0c;重新推导一…...

扣子工作流中禁止同类别的图像流节点,不能超过4个

一、问题1不能在一个工作流中超过4个图像的并行节点 1、现象 本来想着在扣子中一次生成多张图片。 然后问了扣子小助手 2、图像节点限制 扣子给了如下反馈 近期图像流上线了并发限额&#xff0c;具体规则如下&#xff1a; 针对对象&#xff1a;单用户维度&#xff0c;非 bot…...

Java 语言深度剖析与实践应用

一、引言 Java 作为一种广泛应用于各种领域的编程语言&#xff0c;自 1995 年诞生以来&#xff0c;凭借其跨平台性、面向对象特性、丰富的类库以及强大的生态系统&#xff0c;在软件开发行业占据着重要地位。无论是企业级应用开发、移动应用开发、大数据处理还是分布式系统构建…...

1.14学习总结

日常刷题单 刷了题目后&#xff0c;对于排序方法更加熟练&#xff0c;手搓代码的速度也得到了提高。 感觉字符串还不熟练&#xff0c;高精度更是云里雾里&#xff0c;上升空间极大。 同时看见今晚有个入门难度的测试&#xff0c;去练了练手&#xff0c;想看看自己是什么成分&…...

C++蓝桥杯基础篇(三)

片头 哈喽&#xff01;小伙伴们&#xff0c;大家好~&#xff0c;今天我们来学习蓝桥杯基础篇&#xff08;三&#xff09;&#xff0c;继续练习相关习题&#xff0c;准备好了吗&#xff1f;我们开始啦~ 一、while循环 可以简单理解为循环版的if语句。if语句是判断1次&#xff0…...

微信小程序的制作

制作微信小程序的过程大致可以分为几个步骤&#xff1a;从环境搭建、项目创建&#xff0c;到开发、调试和发布。下面我会为你简要介绍每个步骤。 1. 准备工作 在开始开发微信小程序之前&#xff0c;你需要确保你已经完成了以下几个步骤&#xff1a; 注册微信小程序账号&…...

Sass更新:@import——>@use

背景&#xff1a;将一个公共的CSS样式文件导入到任意一个组件中进行使用 一、创建并使用CSS公共样式文件 1、在目录的assets目录下创建一个style文件夹&#xff0c;里面存放一个.scss文件&#xff08;例&#xff1a;mixin.scss&#xff09; 2、文件内以mixin来设置名为flex的…...

Python使用Flask结合DeepSeek开发

一、背景 我之前关于DeepSeek使用ollama部署的文章大家可以把DeepSeek大模型部署起来。那么ollama还提供了可以调用对应部署模型的API接口。我们可以基于这些接口&#xff0c;做自己的二次开发。使用pythonflaskollama就可以进行模型对话调用。并且前端采用SSE的技术&#xff0…...

python中的抽象类在项目中的实际应用

抽象类在项目中的实际应用主要体现在 规范代码结构、强制子类实现某些方法、提供部分通用功能&#xff0c;让代码更稳定、易维护。 举个例子&#xff1a;数据校验器 假设你在做一个 用户输入校验系统&#xff0c;需要支持 数字校验、字符串校验 和 邮箱校验。如果不用抽象类&…...

New Game--(单调队列)

I - New Game 有一种新的游戏&#xff0c;Monocarp 想要玩。这个游戏使用一副包含 n 张牌的牌堆&#xff0c;其中第 i 张牌上写有一个整数 a_i。 在游戏开始时&#xff0c;Monocarp 可以在第一轮选择牌堆中的任意一张牌。在接下来的每一轮中&#xff0c;Monocarp 可以选择一张…...

mapbox V3 新特性,添加下雪效果

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;mapbox 从入门到精通 文章目录 一、&#x1f340;前言1.1 ☘️mapboxgl.Map 地图对象…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...

WEB3全栈开发——面试专业技能点P7前端与链上集成

一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染&#xff08;SSR&#xff09;与静态网站生成&#xff08;SSG&#xff09; 框架&#xff0c;由 Vercel 开发。它简化了构建生产级 React 应用的过程&#xff0c;并内置了很多特性&#xff1a; ✅ 文件系…...