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

中搜网站提交网站切换中英文

中搜网站提交,网站切换中英文,服装店设计,dw怎么建设网站目录 目录 1.0 定义 2.0 为什么使用链表 3.0 链表原理 4.0 创建链表节点 5.0 链表原理续 6.0 链表实现 6.0.1 创建节点 6.0.2 初始化链表 6.0.3 添加链表节点 6.0.4 循环遍历 6.0.5 插入节点 6.0.6 插入头结点main函数 7.0 完整代码 8.0 节点添加方案二 8.0.1 …目录 目录 1.0 定义 2.0 为什么使用链表 3.0 链表原理 4.0 创建链表节点 5.0 链表原理续 6.0 链表实现 6.0.1 创建节点 6.0.2 初始化链表 6.0.3 添加链表节点 6.0.4 循环遍历 6.0.5 插入节点 6.0.6 插入头结点main函数 7.0 完整代码 8.0 节点添加方案二 8.0.1 循环遍历关键点 8.0.2 添加节点的关键 9.0 遍历链表节点 10.0 程序实现 10.0.1 创建链表节点 10.0.2 初始化链表 10.0.3 模拟节点数据 10.0.4 添加节点 10.0.5 打印节点 10.0.6 main函数部分 1.0 定义 链表是由一系列节点组成每个节点包含数据域和指针域线性表的顺序存储用一块连续的内存空间线性表的链式存储有一块不连续的存储空间。 2.0 为什么使用链表 智能网关需要具备动态管理子设备的功能注册、添加、删除、获取数据等等如何设计网关软件的数据结构管理所有的子设备假如使用TempHumisensor结构体表示单点子设备的数据: 如果使用数组进行管理存在一个问题元素数量如何定义不同环境部署的子设备数量是有差异的太大会浪费内存太小会导致子设备数量受限需要找到一种按需分配的方案我们首先会想到指针和动态内存: 各子设备对应的动态内存不像数组内存布局是不连续的所以需要找到一种方案能将这些动态内存串联起来这就要用到链表数据结构了。 3.0 链表原理 第一个链表节点保存的是第二个节点的地址第二个节点保存的是第三个节点的地址第三个节点保存的是下一个节点的地址。 4.0 创建链表节点 /*** brief 创建链表节点* param id 链表id编号* param humi 温度数据* param temp 湿度数据* */ typedef struct LINKNODE {uint8_t id;uint8_t humi;uint8_t temp;struct LINKNODE *next; } LinkNode_t; 注为什么结构体中能嵌套自己编译不会报错吗? 如果成员是struct TempHumiListNode next;会报错因为编译器在解析这个成员时结构体还没结束不知道该为它分配多大内存空间;如果是*next因为是指针类型对于ARM 32平台编译器会固定分配4个字节内存空间用于保存下个子设备对应的动态内存首地址。 5.0 链表原理续 现在能将动态内存的数据串联起来了但是还不够需要设计一个“火车头”火车头不需要对应实际的子设备火车厢对应实际子设备保存设备数据。 注链表的火车头称之为头节点火车厢叫做“节点” “头节点”和“节点”只是动态内存块在程序中还需要一个变量来保存头节点的首地址这个变量就叫做“头指针”准确的说应该是“头指针变量”,这样通过这个头指针就可以访问头节点数据再通过头节点的next成员访问后面的节点: 6.0 链表实现 以下是实现链表的步骤 1.0 链表初始化(创建头结点); 2.0 添加节点当检测到新子设备时添加到链表尾部; 3.0 遍历链表节点: 4.0 删除节点当检测到子设备下线时从链表中删除 6.0.1 创建节点 typedef struct LINKNODE {uint8_t id;uint8_t humi;uint8_t temp;struct LINKNODE *next; } LinkNode_t; 注节点中包含数据域和指针域数据域包括id humi temp指针域就是*next保存下一个节点的地址。 6.0.2 初始化链表 注该操作的作用是创建头节点用一个指针保存头节点的地址方便头节点去访问后面的节点 LinkNode_t *InitLinkList(void) {LinkNode_t *header (LinkNode_t *)malloc(sizeof(LinkNode_t));if (header NULL){return;}else{header-id 0;header-next NULL;return header;} } 6.0.3 添加链表节点 出现新节点时追加到链表的尾部,添加节点尾节点的特点是NEXT成员保存的地址值为NULL 定义一个局部变量TempHumiListNode *current从头节点开始循环遍历节点:  // 定义局部变量TempHumiListNode *current LinkNode_t *current header; while (current-next ! NULL) {current current-next; } 添加节点 初始化赋值TempHumiListNode *current headerheader400所以赋值以后current保存了地址400: 6.0.4 循环遍历 遍历链表节点使得current从一个节点指向下一个节点 循环边界条件表达式:目标是找到next成员保存地址值为NULL的节点 遍历链表节点使得current从一个节点指向下一个节点:要想current指向节点1只需要将40C地址值赋值给current这个地址值是保存在前向节点的next成员中所以使用current-next可以获得40C地址值接下来将它赋值给current就可以:current current-next; 循环边界条件表达式 目标是找到成员next保存地址值是NULL的节点就结束所以循环条件表达式设计为 while (current-next ! NULL)。 添加到新节点到链表尾部:current-next node; node-next NULL; /*** brief 模拟节点数据* param 无参数* return LinkNode_t**/ LinkNode_t *Search_LinkList_Data(void) {LinkNode_t *node (LinkNode_t *)malloc(sizeof(LinkNode_t));if (node NULL){return NULL;}else{static uint8_t id 100;id--;node-humi 40;node-temp 20.5f;return node;} } 6.0.5 插入节点 static LinkNode_t *g_header;// 插入一个节点node void Add_LinkList_Data(LinkNode_t *header, LinkNode_t *node) {LinkNode_t *current header;if (current-next ! NULL){current current-next;}current-next node;node-next NULL; } 6.0.6 插入头结点main函数 int main(void) {g_header InitLinkList();if (g_header NULL){return -1;}LinkNode_t *node;for (uint8_t i 0; i 3; i){node Search_LinkList_Data();if (node NULL){continue;}Add_LinkList_Data(g_header, node);}return 0; } 7.0 完整代码 #include stdint.h #include stdlib.h #include stdio.h/*** brief 创建链表节点* param id 链表id编号* param humi 温度数据* param temp 湿度数据**/ typedef struct LINKNODE {uint8_t id;uint8_t humi;uint8_t temp;struct LINKNODE *next; } LinkNode_t;/*** brief 初始化链表* param 无参数* return LinkNode_t**/ LinkNode_t *InitLinkList(void) {LinkNode_t *header (LinkNode_t *)malloc(sizeof(LinkNode_t));if (header NULL){return NULL;}else{header-id 0;header-next NULL;return header;} }/*** brief 模拟节点数据* param 无参数* return LinkNode_t**/ LinkNode_t *Search_LinkList_Data(void) {LinkNode_t *node (LinkNode_t *)malloc(sizeof(LinkNode_t));if (node NULL){return NULL;}else{static uint8_t id 100;id--;node-humi 40;node-temp 20.5f;return node;} }static LinkNode_t *g_header;// 插入一个节点node void Add_LinkList_Data(LinkNode_t *header, LinkNode_t *node) {LinkNode_t *current header;if (current-next ! NULL){current current-next;}current-next node;node-next NULL; }int main(void) {g_header InitLinkList();if (g_header NULL){return -1;}LinkNode_t *node;for (uint8_t i 0; i 3; i){node Search_LinkList_Data();if (node NULL){continue;}Add_LinkList_Data(g_header, node);}return 0; } 8.0 节点添加方案二 使用两个指针变量prev和currentprev一直指向current的前向节点初始化为 TempHumiListNode *prev g_header;TempHumiListNode *current g_header-next; 8.0.1 循环遍历关键点 注以下是使用这种方式的关键点 1 遍历链表节点使得prev和current从一个节点指向下一个节点 2 循环边界条件表达式:目标是通过prev找到next成员保存地址值为NULL的节点 8.0.2 添加节点的关键 步骤一 遍历链表节点使得prev和current从一个节点指向下一个节点: 要想prev指向下一个节点也就是current指向的节点执行:prevcurrent; 要想current指向不一个节点执行:currentcurrent-next; 步骤二 循环边界条件表达式;目标是通过prev找到next成员保存地址值为NULL的节点就结束:此时current指向为NULL所以条件表达式设计为:while(current! NULL) 第三步 添加到新节点到链表尾部 prev-next node;node-next NULL; 9.0 遍历链表节点 注这样做的目的是打印所有节点的数据 使用一个指针变量current参照添加节点第2种方案从节点1开始循环遍历每一个节点初始化 TempHumiListNode *currentcurrent g header-next; 循环遍历关键点 遍历链表节点使得current从一个节点指向下一个节点; 循环边界条件表达式;目标是通过current遍历完所有节点 遍历链表节点使得current从一个节点指向下一个节点: 要想current指向下一个节点执行:currentcurrent-next; 循环边界 循环边界条件表达式;目标是通过current遍历完所有节点就结束: 此时current指向为NULL所以条件表达式设计为:while(current! NULL) 10.0 程序实现 注以下是基于方案二代码的程序设计与实现仅供学习参考 10.0.1 创建链表节点 相当于是链表里面的内存块就是一个一个的节点以下是具体的程序代码 // 创建链表节点 typedef struct LINKNODE {uint8_t id;uint8_t humi;uint8_t temp;struct LINKNODE *next; } LinkNode_t; 10.0.2 初始化链表 实际的初始化链表表示的是设置链表的头部也就是上面讲到的火车头头指针保存的是头节点的地址。 实际代码程序下面做实际的讲解 // 初始化链表 LinkNode_t *LinkNode_Init(void) {// 创建结构体指针LinkNode_t *header (LinkNode_t *)malloc(sizeof(LinkNode_t));if (header NULL){printf(malloc has give space faild);return NULL;}else{header-id 0;header-next NULL;return header;} } LinkNode_t *LinkNode_Init(void) 是一个指针函数函数的返回值是结构体类型可以使用这个 LinkNode_t *header (LinkNode_t *)malloc(sizeof(LinkNode_t));这段代码的意思是创建了一个结构体指针变量给结构体指针变量分配内存地址 这段代码的意思是判断动态内存有没有分配成功如果header NULL表示没有分配成功如果 header ! NULL 表示动态内存开辟成功这个时候else后面的代码就是给第一个内存块也就是 链表的头部赋初始值返回的第第一个节点头节点的地址。 10.0.3 模拟节点数据 注这段代码的意思是创建一个指针变量给它分配内存如果分配失败返回NULL分配成功写入一些固定的初始化值返回节点的地址。 10.0.4 添加节点 注这段代码的意思是创建一个添加节点的函数函数的名字是LinkNode_Add函数的参数是 (LinkNode_t *header, LinkNode_t *node)创建两个局部变量分别是LinkNode_t *prev header;  LinkNode_t *pCurrent header-next;用来保存头指针变量的地址和头指针变量下一个节点的地址。 这段代码的意思是如果当前current指向的节点不是最后一个节点那么prev和pCurrent分别向后移动一位然后追加新的节点到链表的尾部prev-next node;其中prev保存的是下一个节点的地址然后下一个节点的地址指向的是MULL。 10.0.5 打印节点 创建打印节点函数参数是链表创建一个指针指向头节点的下一个节点判断内存分配有没有成功如果没有成功直接返回如果成工表示有节点给节点赋值然后当前的节点指向下一个节点直到变量完最后一个节点为止。 10.0.6 main函数部分 g_header LinkNode_Init(); 将结构体的地址赋值给全局变量通过这个变量访问第一个头节点的地址然后判断内存分配是否成功这个是基本的操作成功打印节点创建局部变量node 使用while循环里面嵌套了一个for循环次数是3次然后给node赋值一个地址也就是节点的数据 判断内存分配是否成功不成功使用continue结束本次循环进入下一次循环不是直接添加节点打印输出。 .....删除节点......
http://www.dnsts.com.cn/news/113026.html

相关文章:

  • 重庆网站建设论文做网页一般多少钱
  • 做网站推广的公司发展前景工信部网站手机备案查询
  • 深圳定制网站建设上海装修公司推荐
  • 深圳专业做公司网站浙江外发加工网
  • 重庆教育网站建设企业软件定制开发公司
  • 网站怎么做适配wordpress编辑器如何增加行距功能
  • 成都网站建设推台州品牌网站建设
  • html5手机网站开发区别wordpress取消301跳转
  • 建设工程造价网站南宁做网站设计方案
  • 北京东城区做网站的公司网站备案到期了怎么办
  • 使用wordpress做图站摄影官网
  • 免费域名注册服务网站搭建网站要什么配置
  • 郑州建设高端网站网站制作哪个公司好
  • 黄浦集团网站建设兰州一氧化碳
  • cdn网站加速有用吗什么样的网站流量容易做
  • 对外宣传及网站建设文件稿可以自己做网站优化吗
  • 外贸网站seo招聘女装网站建设项目可行性分析
  • 美食网站设计的代码重庆网站建设重庆最加科技
  • 吉林省软环境建设网站使用模块化的网站
  • 规划馆网站建设外国网站上做雅思考试
  • 邯郸普通网站建设那家公司装修比较好
  • 郑州电子商务网站建设品牌设计师需要具备什么能力
  • 杭州投资公司自适应网站深圳自适应网站建设
  • 电信备案网站打不开软装设计公司名称
  • 热门的建设工程人员查询潍坊seo招聘
  • 买网站服务器要多少钱一年辽宁建设建设工程信息网
  • 将网站制作成app站长
  • 做硬件产品网站域名怎么申请
  • 设计素材网站排行榜前十名建网站找哪个平台好呢
  • 网站建设设计理念呼和浩特网站建设小程序