玳瑁的嵌入式日记D21-08020(数据结构)

双向链表


double link list

typedef struct dou_node {
DATATYPE data;
struct dou_node *prev;
struct dou_node *next;
}DouLinkNode;


双向链表:

节点  =  数据 + NEXT +PREV .
手撕代码(增加+删除)
增加,删除的操作, 需要 tmp 停止待操作节点的前一节点上。
查找操作进行了扩展,回调函数(函数指针)。解耦合,扩展功能。


查找                               顺序表O(1)         链表  O(n)
插入和删除                     顺序表 O(n)       链表   O(1)

空间性能
顺序表          需要预先分配空间,大小固定
链表             不需要预先分配,大小可变,动态分配


int InsertHeadDouLinkList(DouLinkList *list,DATATYPE *data)
{
DouLinkNode *newnode = (DouLinkNode*)malloc(sizeof(DouLinkNode));
if ( NULL == newnode )
{
perror( "IsertHeadDouLinkList malloc error" );
return 1;
}
  memcpy(&newnode->data,data,sizeof(DATATYPE));
newnode->prev = NULL;
newnode->next = NULL;
if ( IsEmptyLinkList(list) )
{
list->head = newnode;
}
else{
newnode->next = list->head;
  list->head->prev = newnode;
list->head = newnode;
}
list->clen++;
return 0;
}

int InsertTailDouLinkList(DouLinkList *dl, DATATYPE *data)
{
if (IsEmptyLinkList(dl))
{
return InsertHeadDouLinkList(dl, data);
}
else
{
DouLinkNode *newnode = malloc(sizeof(DouLinkNode));
if (NULL == newnode)
{
perror("InsertTailDouLinkList malloc");
return 1;
}
memcpy(&newnode->data, data, sizeof(DATATYPE));
newnode->next = NULL;
newnode->prev = NULL;

    DouLinkNode *tmp = dl->head;
while (tmp->next)
{
tmp = tmp->next;
}

    newnode->prev = tmp;
tmp->next = newnode;

}
dl->clen++;
return 0;
}

int InsertPosLinkList(DouLinkList *list, DATATYPE *data,int pos)
{
if(pos<0 || pos > list->clen)
{
printf("InsertPosLinkList pos error\n");
return 1;
}

    if(pos == 0)
{
return InsertHeadDouLinkList(list,data);
}
else if(pos == list->clen)
{
return InsertTailDouLinkList(list, data);
}else
{

    DouLinkNode *newnode = malloc(sizeof(DouLinkNode));
if(NULL == newnode)
{
perror("InsertPosLinkList malloc error");
return 1;
}
memcpy(&newnode->data,data,sizeof(DATATYPE));
newnode->next = NULL;
newnode->prev = NULL;
DouLinkNode *tmp = list->head;
for(int i = 0; i < pos; i++)
{
tmp = tmp->next;
}

    newnode->next = tmp;
newnode->prev = tmp->prev;
tmp->prev->next = newnode;
tmp->prev = newnode;
list->clen++;

    }
return 0;
}


gdb



typedef enum {DIR_FORWARD,DIR_BACKWARD}DIRECT;    //枚举

int ShowLinkList(DouLinkList *list,DIRECT direct)  
{
DouLinkNode *tmp = list->head;
if(DIR_FORWARD == direct)
{
while(tmp)
{
printf("%s \n",tmp->data.data);
tmp = tmp->next;
}

    }else
{
while(tmp->next)
{
tmp = tmp->next;
// 移到最后
while(tmp)
{
printf("%s \n",tmp->data.data);
tmp = tmp->prev;
}      
}

return 0;
}


int ReviseLinkList(DouLinkList *list)
{
if(list == NULL|| list->clen == 0)
{
printf("RviseLinkList error");
return 1;
}
DouLinkNode *prev = NULL;
DouLinkNode *curr = list->head;
DouLinkNode *next = NULL;


while(curr!=NULL)
{
  next = curr->next;
prev = curr->prev;

curr->next = prev; //后移
prev = curr;
curr = next;
}
list->head = prev;
return 0;
}


DouLinkNode *FindDouLinkList(DouLinkList *dl,PFUN fun, void*arg);

DouLinkNode *FindDouLinkList(DouLinkList *dl,PFUN fun, void*arg)
{
DouLinkNode* tmp = dl->head;
while(tmp)
{
// if(0==strcmp(tmp->data.name,name))
if ( fun ( &tmp->data , arg))
{
return tmp;
}
tmp=tmp->next;
}
return NULL;
}

int findperbyname(DATATYPE*data,void* arg)
{
// 从void* -> 其他类型指针,需要强转
return 0 == strcmp(data->name,(char*)arg);
}

int findperbyage(DATATYPE*data,void* arg)
{
// 从void* -> 其他类型指针,需要强转
return data->age == *(int*)arg;;
}


   printf("------------------------find-----------------------------\n");
char want_name[] = "lisi";
int age =50;
DouLinkNode* tmp = FindDouLinkList(list,findperbyname ,want_name);
if (NULL == tmp)
{
printf("cant find per %s\n",want_name);
}
else
{
printf("find it,name:%s score:%d\n",tmp->data.name,tmp->data.score);
}

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

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

相关文章

Uipath查找元素 查找子元素 获取属性活动组合使用示例

Uipath 查找元素 查找子元素 获取属性组合使用示例使用场景案例介绍项目流程图附加浏览器查找元素查找子元素遍历循环获取属性点击元素使用场景 在实际场景中&#xff0c;有时需RPA自动点击某组范围元素或获取某组范围元素的值&#xff0c;如需获取指定的父元素&#xff0c;再…

【MongoDB与MySQL对比】

MongoDB 与 MySQL 全方位对比分析在现代软件开发中&#xff0c;数据库的选择直接影响系统性能、扩展性和开发效率。MongoDB 和 MySQL 作为两种主流数据库&#xff0c;分别代表了 NoSQL 和关系型数据库的典型&#xff0c;各自在不同场景中发挥着重要作用。本文将抛开代码示例&am…

Spring AI开发指导-对话模型

对话模型接口描述Spring AI基于Spring Cloud的架构体系&#xff0c;定义了一系列可扩展的API接口&#xff0c;支持对接不同类型的AI大模型的核心功能&#xff0c;这些API接口支持同步编程模式或者异步编程模式&#xff1a;接口ModelModel是同步编程模式接口&#xff0c;其参数支…

Win11 下卸载 Oracle11g

目录 1、停止服务 2、启动 Universal install 应用 3、执行 deinstall.bat 脚本 4、删除注册表相关数据 5、删除环境变量中的oracle相关路径 6、删除安装文件 7、删除C盘中的相关Oracle文件 8、删除 Oracle 数据存放目录 9、检查 10、重装oracle可能还会碰到的问题 &…

深入剖析Spring Boot应用启动全流程

目录 前言 启动流程概览 一、第一阶段&#xff1a;初始化SpringApplication 二、第二阶段&#xff1a;运行SpringApplication 三、第三阶段&#xff1a;环境准备 四、第四阶段&#xff1a;创建应用上下文 五、第五阶段&#xff1a;准备应用上下文 六、第六阶段&#xf…

Matplotlib 可视化大师系列(三):plt.bar() 与 plt.barh() - 清晰对比的柱状图

目录Matplotlib 可视化大师系列博客总览Matplotlib 可视化大师系列&#xff08;三&#xff09;&#xff1a;plt.bar() 与 plt.barh() - 清晰对比的柱状图一、 柱状图是什么&#xff1f;何时使用&#xff1f;二、 函数原型与核心参数plt.bar(x, height, ...) - 垂直柱状图plt.ba…

基于 FastAPI 和 OpenFeature 使用 Feature Flag 控制业务功能

模拟业务场景&#xff1a;多租户系统跨域转账&#xff0c;需要控制某租户下某用户是否可以在某域转账 open_feature_util.py import typing from abc import abstractmethod, ABCMeta from typing import Sequencefrom openfeature.evaluation_context import EvaluationContex…

Stm32通过ESP8266 WiFi连接阿里云平台

本文将介绍stm32如何通过WiFi来连接阿里云&#xff0c;上传数据和接收指令。要先与阿里云建立TCP连接&#xff0c;然后再通过MQTT协议交互。 大体流程&#xff1a;1、在阿里云网页上创建产品和设备&#xff1b;2、stm32通过WiFi连接云平台&#xff1b;3、MQTT连接阿里云&#…

北京-测试-入职甲方金融-上班第三天

今日上班时间9-20.18&#xff0c;再加42分钟就可以拿到75块钱了&#xff0c;但我想回家&#xff0c;所以下班今天上午有人事举办的入职培训&#xff0c;下午有业务培训&#xff0c;培训完领导给我安排了两个需求。慌死&#xff0c;吓死&#xff0c;我都不懂&#xff0c;业务和工…

Java基础第2天总结

使用switch时注意事项&#xff1a;表达式类型只能是byte、short、int、char,JDK5开始支持枚举&#xff0c;JDK7开始支持String&#xff0c;不支持double、float、long(精确度问题&#xff0c;小数有点不精确)。case给出的值不允许重复&#xff0c;且只能是字面量&#xff0c;不…

鸿蒙开发中的List组件详解

目录 引言 1.List组件基础 2.List接口参数 1.space 2.initialIndex 3.scroller 3.ListView的属性 1.listDirection 2.lanes 3.divider 4.scrollBar 4.布局与约束 5.ListItem生命周期 1.使用ForEach创建ListItem 2.使用LazyForEach创建ListItem 3…

2026界计算机专业毕业的有福了!(开题报告任务书)

开题报告 我们以基于Java的婚纱店管理系统为案例进行指导。 任务书&#xff1a; 首先是毕设的立题依据&#xff0c;这个主要描写一些简洁大体的大白话&#xff0c;描述一下你为什么要做这个题目的毕设。 那就需要你描述一下现阶段社会面婚纱店的运营情况&#xff0c;写一些…

安全、高效、可靠的物理隔离网络安全专用设备———信刻光盘安全隔离与文件单向导入系统!

着各种数据传输、储存技术、信息技术的快速发展&#xff0c;保护信息安全是重中之重。军工企业、政府、部队及企事业单位等利用A网与B网开展导入/导出相关工作已成为不可逆转的趋势。针对于业务需要与保密规范相关要求&#xff0c;涉及重要秘密信息&#xff0c;需做到完全的物理…

JetPack 与 PyTorch 版本对应及资源详情

下载链接 JetPack 版本适配 PyTorch 版本发布日期可下载资源&#xff08;.whl 安装包 / 文档&#xff09;JP 6.1PyTorch 2.5.0a0&#xff08;构建号&#xff1a;872d972e41.nv24.08.17622132&#xff09;2024/10/01- torch-2.5.0a0872d972e41.nv24.08.17622132-cp310-cp310-li…

【c++进阶系列】:万字详解多态

&#x1f525; 本文专栏&#xff1a;c &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 你以为自己在孤独地爬坡吗&#xff1f;看看身后吧——那些被汗水浸湿的脚印&#xff0c;早已连成一道向上的阶梯 ★★★ 本文前置知识&am…

AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年8月23日第168弹

从今天开始&#xff0c;咱们还是暂时基于旧的模型进行预测&#xff0c;好了&#xff0c;废话不多说&#xff0c;按照老办法&#xff0c;重点8-9码定位&#xff0c;配合三胆下1或下2&#xff0c;杀1-2个和尾&#xff0c;再杀4-5个和值&#xff0c;可以做到100-300注左右。(1)定位…

分布式搜索(Elasticsearch)深入用法

目录 数据聚合 聚合的种类 DSL实现聚合 桶聚合 度量聚合 RestAPI实现聚合 多条件聚合 自动补全 拼音分词器 自定义分词器 自动补全查询 实现搜索框自动补全 数据同步 数据同步思路分析 实现elasticsearch与数据库数据同步 集群 搭建ES集群 集群脑裂问题 集群…

java:接口与实现类

1. Java 基础层面接口&#xff08;Interface&#xff09; 只是方法的定义/规范&#xff0c;里面没有真正的逻辑。例如&#xff1a;public interface IBookService {boolean save(Book book); }&#x1f449; 这里只说明了&#xff1a;我要有一个 save 方法&#xff0c;但“怎么…

Chrome 插件开发实战:从入门到进阶

1.1 Chrome 插件的魅力与应用场景Chrome 插件是增强 Chrome 浏览器功能的得力助手&#xff0c;能实现广告拦截、密码管理、标签管理等实用功能。在日常办公中&#xff0c;我们可以借助插件提升效率&#xff0c;如自动填充表单、快速保存网页内容&#xff1b;在浏览网页时&#…

通过官方文档详解Ultralytics YOLO 开源工程-熟练使用 YOLO11实现分割、分类、旋转框检测和姿势估计(附测试代码)

目录 前言&#xff1a; 1.了解ultralytics工程与yolo模型 1.1 yolo11可以为我们做些什 1.2 yolo11模型的高性能 1.3 对于yolo11一些常见的问题 1.3.1 YOLO11 如何以更少的参数实现更高的精度&#xff1f; 1.3.2 YOLO11 可以部署在边缘设备上吗&#xff1f; 2. 深入了解y…