github源码指引:共享内存、数据结构与算法:树形结构ListTree

本文主要是介绍github源码指引:共享内存、数据结构与算法:树形结构ListTree,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。


        专题:共享内存、数据结构与算法_初级代码游戏的博客-CSDN博客

        本文讲解带有子项的链表。

一、介绍

        与上一篇介绍的单向链表相比,多了一个子项指针。可以理解为原来的链表是兄弟关系,子项指针则是父子关系,从而可以构建树形结构。

        节点结构如下:

		T_SHM_SIZE hNext;//-1:无;0-N,指向下个地址T_SHM_SIZE hChild;//-1:无;0-N,指向子数据T_DATA data;

        迭代器复杂一些:

			bool isEnd()const { return -1 == handle; }bool hasNext()const { return -1 != LIST_NODE::at(handle).hNext; }long getNext()const { return LIST_NODE::at(handle).hNext; }void setNext(T_SHM_SIZE h)const { LIST_NODE::at(handle).hNext = h; }void setChild(T_SHM_SIZE h)const { LIST_NODE::at(handle).hChild = h; }long getChild()const { return LIST_NODE::at(handle).hChild; }

        容器操作也复杂一些:

		//查找一个项,没找到返回false,h返回找到的位置或列表最后一个节点bool FindInList(iterator const & head, T_DATA const & data, iterator & it)const;//添加data到head,如果head是isEnd则添加到新列表并放置位置在h,如果已经存在则覆盖,如果head是isEnd则会被修改bool AddList(iterator & head, T_DATA const & data, iterator & it);//添加data到head,如果head是isEnd则添加到新列表并放置位置在h,如果已经存在则覆盖,如果head是isEnd则会被修改bool AddChild(iterator const & node, T_DATA const & data, iterator & it);//添加data到head的尾部,如果head是isEnd则添加到新列表并放置位置在head,不检查是否存在bool AddTail(iterator & head,T_DATA const & data);//删除子项bool DeleteChild(iterator const & node);//删除链表bool DeleteList(iterator const & head);//删除链表的一个项bool DeleteListOne(iterator & head,iterator const & toDelete);

二、演示代码

#include "shmMultiListTree.h"
class CTest_T_MULTI_LISTTREE
{
public:struct DemoData : public CActiveObjectBase{typedef DemoData T_ME;long a = 0;long b = 0;long c = 0;sstring<8> s;//用于需要排序的场合bool operator < (T_ME const& tmp)const{return a == tmp.a ? (b == tmp.b ? c < tmp.c : b < tmp.b) : a < tmp.a;}//部分比较函数static bool Less_A(T_ME const& tmp1, T_ME const& tmp2){return tmp1.a < tmp2.a;}//某些场合也需要等于bool operator == (T_ME const& tmp)const { return !(*this < tmp) && !(tmp < *this); }friend ostream& operator << (ostream& o, T_ME const& d){return o << d.a << " " << d.b << " " << d.c << " " << d.s.c_str();}//关键字的hash值,用于分块场合,应保证hash值的最后一部分仍然是平均分布的long keyhash()const { return a; }//用于输出数据的场合string& toString(string& str)const{char buf[2048];sprintf(buf, "%ld %ld %ld %s", a, b, c, s.c_str());return str = buf;}//用于表格输出static bool AddTableColumns(CHtmlDoc::CHtmlTable2& table){table.AddCol("A", CHtmlDoc::CHtmlDoc_DATACLASS_RIGHT);table.AddCol("B", CHtmlDoc::CHtmlDoc_DATACLASS_RIGHT);table.AddCol("C", CHtmlDoc::CHtmlDoc_DATACLASS_RIGHT);table.AddCol("S", CHtmlDoc::CHtmlDoc_DATACLASS_RIGHT);return true;}bool AddTableData(CHtmlDoc::CHtmlTable2& table)const{table.AddData(a);table.AddData(b);table.AddData(c);table.AddData(s.c_str());return true;}};typedef T_MULTI_LISTTREE<DemoData, PI_TEST_1 > T_CONTINER;static int test_T_MULTI_LISTTREE(int argc, char** argv){T_CONTINER a("test", 1);a.getIShmActiveObject()->DestoryShm();if (!a.getIShmActiveObject()->CreateShm())return __LINE__;thelog << endi;if (!a.getIShmActiveObject()->Attach(false))return __LINE__;thelog << endi;string str;vector<T_CONTINER::iterator > v_heads;for (int i = 0; i < 2; ++i){T_CONTINER::iterator head;for (int j = 10; j < 12; ++j){DemoData tmp2;tmp2.a = i;tmp2.b = j;T_CONTINER::iterator it2;if (!a.AddList(head, tmp2, it2))return __LINE__;thelog << "添加成功 " << head.handle << " " << it2.handle << " : " << tmp2.toString(str) << endi;if(10==j)v_heads.push_back(head);for (int k = 100; k < 102; ++k){DemoData tmp3;tmp3.a = i;tmp3.b = j;tmp3.c = k;T_CONTINER::iterator it_child;if (!a.AddChild(it2, tmp3, it_child))return __LINE__;thelog << "添加成功 " << i << " " << j << " " << k << " : " << tmp3.toString(str) << endi;}}}for (vector<T_CONTINER::iterator >::const_iterator it = v_heads.begin(); it != v_heads.end(); ++it){str = "";thelog << (*it).handle << endl << a.ReportList((*it).handle, str) << endi;}a.getIShmActiveObject()->RunCmdUI();return 0;}
};

        这段代码构建了两个链表,每个链表有两个节点,每个节点有两个子数据。

三、运行结果

        rebuild.sh 编译,run.sh运行,命令26(初次运行要先创建主共享内存命令0-1):

[09-04 08:52:44][应用][信息][shmfctest2.h            : 583(test_T_MULTI_LISTTREE)][  0.00]00:0 10 01:0 10 1002:0 10 1013:0 11 04:0 11 1005:0 11 101[09-04 08:52:44][应用][信息][shmfctest2.h            : 583(test_T_MULTI_LISTTREE)][  0.00]66:1 10 07:1 10 1008:1 10 1019:1 11 010:1 11 10011:1 11 101

         冒号前面是节点号。使用共享内存管理界面的命令9可以查看到具体结构:

 h NEXT CHILD | A  B   C S
-- ---- ----- - - -- --- -0    3     1 | 0 10   01    2    -1 | 0 10 1002   -1    -1 | 0 10 1013   -1     4 | 0 11   04    5    -1 | 0 11 1005   -1    -1 | 0 11 1016    9     7 | 1 10   07    8    -1 | 1 10 1008   -1    -1 | 1 10 1019   -1    10 | 1 11   0
10   11    -1 | 1 11 100
11   -1    -1 | 1 11 101
-- ---- ----- - - -- --- -

        应该很容易看明白了。


(这里是文档结束)

这篇关于github源码指引:共享内存、数据结构与算法:树形结构ListTree的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1135759

相关文章

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

Python循环结构全面解析

《Python循环结构全面解析》循环中的代码会执行特定的次数,或者是执行到特定条件成立时结束循环,或者是针对某一集合中的所有项目都执行一次,这篇文章给大家介绍Python循环结构解析,感兴趣的朋友跟随... 目录for-in循环while循环循环控制语句break语句continue语句else子句嵌套的循

github打不开的问题分析及解决

《github打不开的问题分析及解决》:本文主要介绍github打不开的问题分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、找到github.com域名解析的ip地址二、找到github.global.ssl.fastly.net网址解析的ip地址三

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

Python+PyQt5实现文件夹结构映射工具

《Python+PyQt5实现文件夹结构映射工具》在日常工作中,我们经常需要对文件夹结构进行复制和备份,本文将带来一款基于PyQt5开发的文件夹结构映射工具,感兴趣的小伙伴可以跟随小编一起学习一下... 目录概述功能亮点展示效果软件使用步骤代码解析1. 主窗口设计(FolderCopyApp)2. 拖拽路径

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

Android实现一键录屏功能(附源码)

《Android实现一键录屏功能(附源码)》在Android5.0及以上版本,系统提供了MediaProjectionAPI,允许应用在用户授权下录制屏幕内容并输出到视频文件,所以本文将基于此实现一个... 目录一、项目介绍二、相关技术与原理三、系统权限与用户授权四、项目架构与流程五、环境配置与依赖六、完整