打印

个人的编程思维,不要**民意

[复制链接]
楼主: highgear
手机看帖
扫描二维码
随时随地手机跟帖
41
highgear|  楼主 | 2009-5-25 22:15 | 只看该作者 回帖奖励 |倒序浏览

一棵真实的树

    再来说说 tree。tree 是一种奇特的数据结构,实际上包含了数组,链表,甚至dictionary等集合数据结构。所以一旦掌握了tree, 基本上掌握了大多数基本的集合数据结构。想要种“一棵真实的树“,首先要建立“一棵抽象的树“的概念,这样才能达到“一理通而百理通“的效果,这也是很多 mcu 程序员的弱项,尽管具备了很多实际的经验,却没有归纳总结得以技术上的升级。
    在有内存管理的c++下,种一棵立“一棵抽象的树“不难,这颗tree, 不涉及任何实例,不依赖任何数据类型,或者说可以容纳任何任何数据类型,可以任意添加,删除,插入数据,可以通过下标索引来查找,甚至可以联合dictionary通过字符名称查找数据。可以想象,这样的tree, 用来构造一个菜单系统会多么的省力。
   很多嵌入式cpu编程环境通常没有内存管理,mcu甚至内存都很少。种一棵抽象的树显然不适合,如同“带着os的思想去裸奔“的道理一样,要用"一棵抽象的树“去种““一棵真实的树“。
   忘掉书上的晦涩的术语和概念,那是用来吓唬初学者用的。下面会发现种“一棵真实的树“其实很简单。上帝说,要有集合,于是世界上有了集合。集合这个“术语“,最简单的形式,就是数组。

使用特权

评论回复
42
呆板书生| | 2009-5-26 00:32 | 只看该作者

..

如果H大侠要和别人PK,俺书生就不掺和,

但如果是讲课,书生倒喜欢听,

老实说,做那么久程序,虽然搞过不少东西,但对于tree,俺的确是弱项,不过希望H大侠能另外开一个帖子,一个大家心平气和的地方,好让我们在没有硝烟的地方听课。谢谢

使用特权

评论回复
43
HWM| | 2009-5-26 08:03 | 只看该作者

“树”?没有“圈圈”的便是树。简单不?

使用特权

评论回复
44
sklar| | 2009-5-26 16:54 | 只看该作者

路过

不是很常来21IC,来了就顶个灌红了的

使用特权

评论回复
45
dengm| | 2009-5-27 15:38 | 只看该作者

tree 就用数组表示

   SUN_ID --- Index of 长子
   B_ID   --- =0 ===root    > 0 == Index of 弟弟  <0 == -(Index of 父亲) 
   SUB_ID --- >0 === ADDR OF SUB PROGRAME

使用特权

评论回复
46
georgekin203| | 2009-5-27 18:22 | 只看该作者

啥时候pk啊?

看了这么多天了还以为有热闹看,没想到光打嘴仗了。

使用特权

评论回复
47
highgear|  楼主 | 2009-5-27 21:32 | 只看该作者

我也想热闹,可是对手被吓跑了, 前面还气势汹汹的。

我只好孤零零的一个人给大家表演一段,以对得起大家的捧场。

   构造一棵抽象的树,最好使用动态数组或者链表,或者二者组合。这对于没有内存管理的编程环境无疑很痛苦。嵌入式的内存空间往往分为code (ROM) 和 data (RAM),  程序员这时必须考虑一个现实,数据如何存放。可以把数据和管理者tree 都放入ROM 里,形成一棵石化树;也可以把数据放入 ROM 里,而把数据管理者tee枝干放入RAM 里。PC 下,动态数组或者链表里只是包含一串指针,这样可以实现动态的变更数据的组织结构。

   假设一个简单MenuItem 的结构:
struct MenuItem
{
    int        id;
    char*        name;
};


   下面的两种定义方式,可以体现出程序员对待MenuItem数据的考量,这些以后再讲。

        MenuItem     menu[];
    MenuItem*     menu[];

   如何产生一棵石化树呢,看看下面的struct:

struct MenuItem
{
    int            id;
    char*            name;
         struct MenuItem*       subMenu;
         int             subMenuCount;
};

   说穿了,很简单,就是每个子项下面放置一个自身指针(或者是指针的指针),指针指向一个MenuItem集合,这里的集合将是一个数组,并记录数组的尺寸。数组的尺寸可以用一个宏来计算:

#define ARRAYSIZE(a) (sizeof(a) / sizeof(a[0]))

    C++ 下,一棵tree 往往分为节点,节点集合以及修剪工几个部分以实现更为复杂的数据操纵以及方便未来的扩展(一棵抽象的树必须有足够的适应性和可扩展性)。而这里,用单一的一个结构来实现一棵树,更容易理解,而且C 的函数与C++的成员函数不同,数据和代码是分离的。

   首先,定义两个“小小叶子“:

MenuItem menu1[] = 
{
    {1, "1", NULL, 0},
    {2, "2", NULL, 0}
};

MenuItem menu2[] = 
{
    {3, "3", NULL, 0},
    {4, "4", NULL, 0}
};


再定义一个圈圈, 把小小叶子 放进去:
MenuItem OO[] =
{
    {5, "5", menu1, ARRAYCOUNT(menu1)},
    {6, "6", menu2, ARRAYCOUNT(menu2)}
};


最后,根:
MenuItem root =
{
    0, "root", OO, ARRAYCOUNT(OO)
};
    
以此类推,可以 形成一棵枝叶繁茂的大树。

既然MenuItem 包含一个MenuItem 的集合,那么可以理直气壮的使用递归。事实上,递归是处理 tree 上最常见的方法。递归使得代码异常简洁,虽然会在效率上,以及在嵌入式cpu上要当心stack overflow/overwrite.

例如,遍历显示所有MenuItem :

void DisplayMenuItems(MenuItem* pMenu)
{
    int i;
    printf("ID: %d, Name: %s  ", pMenu->id, pMenu->name); 
    for (i=0; i<pMenu->subMenuCount; i++) {
        DisplayMenuItems(&pMenu->subMenu);
    }
}

运行函数, DisplayMenuItems(&root) 的结果:

ID: 0, Name: root
ID: 5, Name: 5
ID: 1, Name: 1
ID: 2, Name: 2
ID: 6, Name: 6
ID: 3, Name: 3
ID: 4, Name: 4

明天继续 .......



使用特权

评论回复
48
headwolf| | 2009-5-27 23:42 | 只看该作者

不妨应该看看鲁迅的<<作揖主义>>

希望我没记错**名。在大学,我们宿舍的一条座右铭是,辩论无用。

使用特权

评论回复
49
xuyiyi| | 2010-7-22 09:04 | 只看该作者
这也要挑战???

使用特权

评论回复
50
shizaigaole| | 2010-7-22 09:33 | 只看该作者
提议用D++再写一个,

这个你们不会吧

使用特权

评论回复
51
xuyiyi| | 2010-7-22 15:22 | 只看该作者
本帖最后由 xuyiyi 于 2010-7-22 15:25 编辑
提议用D++再写一个,

这个你们不会吧
shizaigaole 发表于 2010-7-22 09:33


学习了。

使用特权

评论回复
52
highgear|  楼主 | 2010-7-22 22:11 | 只看该作者
看来, 没有多少人对 tree 等等数据结构感兴趣, 杯具鸟。

俺顶。

使用特权

评论回复
53
szshawn2010| | 2010-7-22 23:09 | 只看该作者
本帖最后由 szshawn2010 于 2010-7-22 23:33 编辑
起因: “按下P1^4,LED闪烁时间加快,按下时间越长,闪烁频率越快。释放开关,频率固定停在当前值闪烁。这才是编程思维挑战“ wxj1952们认为是编程思维挑战, highgear 认为不是。于是wxj1952们 ...
highgear 发表于 2009-5-20 21:42


偶也不认为这是编程思维的挑战。这只能算初级之初级阶段。

赞同14楼,此题确无价值。


关于52楼,虽然我不懂树,但是从你的例程中还是感觉到一种奇人的气息。学习与玩味中!(就凭这点,应该不算是一套完整的杯具鸟!)

另:关于XX出国的事情,我是这样的认为,如果我的儿子长大了没出息,我就得送他出国去溜一圈!再不济就得学下唐骏,花十块钱去买个洋文凭

使用特权

评论回复
54
highgear|  楼主 | 2010-7-23 08:55 | 只看该作者
谢谢 53 楼, 正是因为我对“led 闪烁“持有不屑一顾认为不用mcu都可以做出来的态度, 这才引发了这场 pk. 同时想顺便用 20 级亮度控制来“终结“ 8051 下的 os.

使用特权

评论回复
55
YINGZEZIGA| | 2010-7-23 11:38 | 只看该作者
支持“冷漠”的观点,做程序的要多看看算法,会几种语言只是外行人才会干的事情,内行人要学内功。逛论坛的都扪心自问一下,自己倒底会写什么?4*4键盘,随着科技的发展和MCU的进步,外界资源都多的使不完,一个按键给一个IO口都还富裕,扫描程序各个课本上多了去了。建议要测试的话找个比较难的项目测试,自动识别障碍物运行小车(不是那种跟着地上红线走的)等等。中国的创新意识太薄弱了,怪不得全都只能停留在做玩具的层次。

使用特权

评论回复
56
szshawn2010| | 2010-7-23 16:17 | 只看该作者
本帖最后由 szshawn2010 于 2010-7-23 16:26 编辑
中国的创新意识太薄弱了,怪不得全都只能停留在做玩具的层次
YINGZEZIGA 发表于 2010-7-23 11:38



年轻气盛啊。大道理说的都很容易。

创新,都说好!什么是创新?怎么样创新?
创新的基础阶段是 模仿。连模仿都不会还能创新出什么呢?
搞火箭是创新,修马桶就没有创新的余地了?这样理解就太片面了。

搞程序只搞算法,光说不练,那就真的应该请一尊 赵括 像回家拜拜了。他是这种思想的鼻祖!

年轻的时候,豪言壮语是可以说的(五笔打字时发现 “豪言壮语”与“高谈阔论”是一个码,太神奇了),但也要想周全了再说!


楼上的说到 科技发展资源丰富的问题。我就不敢苟同了。这样一个节能环保的社会,当然也是尽量节约资源的好。这个世界上,能创建理论的或能推翻理论的人,又有几人?对自己的定位要准确,小人物就是小人物。相对论倒背如流,最多也就一书呆书虫,也不能算爱因斯坦。

使用特权

评论回复
57
szshawn2010| | 2010-7-23 16:36 | 只看该作者
PC和MCU本是同根生,怎么可能在软件上没有相通性?这不是“一叶障目,不见泰山“的问题,而是思维单调、僵化的原因罢了。虽然他们具备相通性,但并不是你现在所理解的等同性,你只不是从一个极端跨度到了另一个极端 ...
yewuyi 发表于 2009-5-22 10:00


这位老师的观点,弟子偶也很赞同。

言语之间,也能感觉到是一位务实的人!!也赞一个。

-----------------
莫非是 高手之间都一定要分个雌雄?

使用特权

评论回复
58
成长中的人| | 2010-7-24 16:23 | 只看该作者
;P停战了?

使用特权

评论回复
59
123jj| | 2011-5-7 06:08 | 只看该作者
本 拉 登 死 了,战 争 结 束 了

使用特权

评论回复
60
gouki_s| | 2011-5-11 11:08 | 只看该作者
这样的问题还值得PK?
都太闲了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则