写完B+树的一些感想

花了两天的时间来写B+树,感觉很爽。觉得自己又有了一些进步。
但是其中还是遇到了一些问题。


1、在一个函数中,是这样写的:
root = new Node(NULL);
root->node_set[0] = item;
root->count++;
Leaf* first_leaf = new Leaf(root);
Leaf* second_leaf = new Leaf(root);
first_leaf->set[0] = item;
first_leaf->count++;//ignored!
first_leaf->post_leaf = second_leaf;
second_leaf->pre_leaf = first_leaf;
root->leaf_bucket[0] = first_leaf;
root->leaf_bucket[1] = second_leaf;
root->next_leaf = true;
lead_leaf = first_leaf;

但如果我把first_leaf和second_leaf当做一个struct类型来声明,结果,会发现这个树永远都是空的。这是为什么呢?其实,这是个显然易见的问题,我却想了很久,觉得只要我声明了一个变量,然后把
变量的地址赋予根节点,那么树就建立起来了。然后我在调试的时候,发现根节点指向的下一级元素的地址是对的,但内容就是一个不可预知的东西,也就是说,当函数的生存期过了,函数内产生的所有变量
都会清空,所以才会产生这个问题。这里,只要new一个新的指针,然后再修改这个指针指向的内存的内容,那么在函数结束后,这个指针却能保存下来。达到我的目的。说起来惭愧,因为太久没碰C语言了,
所以才会犯这样低级的错误。用new或者malloc分配的内存空间的生存期是和程序的生存期一样的,因此,就算函数结束,这些空间都不会被清空。

2、发现了typedef的用法和好处。
以前一直觉得typedef没什么用,在上数据结构的时候经常会有以下的语句:
typedef struct NODE Node;
typedef Node* NodePtr;
typedef NodePtr* NodePointer;

typedef是用于声明一种类型的,就是告诉编译器,这个符号是代表哪种数据类型。我一直以为typedef没用,大不了就是可以增加程序的可读性。但是在写了B+树和中途看了expert C后,才发现了它的强大之处。
比如说,我现在分别定义了两种数据类型:struct A, struct B;但是很不幸,A中包涵B类型的变量,B中包含A类型变量。那么定义的顺序无论怎样,都会报错,怎样都会说某个数据结构有一个未定义的类型。
那么怎么办呢?这个时候就要用typedef预先告诉编译器,我在下面或者其他文件(配合extern使用)会定义某个数据类型,这个有点像定义全局变量,一旦完成了这样的定义,只要在变量的作用域中
都能使用这个名字来代表那种类型。虽然上面的例子现在想想可能不太合理,因为这样编译器就无办法分析A和B的类型的字节数(恕我现在还很浅陋,未来的自己,看到这里想笑就笑吧),但是这也足以说明typedef
的强大之处。其实宏定义define也有这样的功能。比如说,
#define MAX 1000
#define int* INT_PTR
(这里不用分号)也能够将一个符号链接到一个常量或者一种类型,但是第二个例子有个很致命的问题,就是编译器在解释INT_PTR时,会解释成int和*两部分,而用typedef则是一个整体。致命点在于,连续用宏定义
的变量,有可能会被改变类型(详情见expertC 第四章)。

3、mem开头的库函数,作用对象以字节为单位。
这个是我在使用memcpy的时候发现的,之前在用memset的时候,很随意的就写了memset(a, 0, sizeof(a));这里sizeof是返回a的字节数!而不是单纯的数据a的元素个数。如果在没有把握知道对象的字节个数的时候,最好是
用sizeof这个函数,特别是,我们不知道在这个系统中,某个类型的大小究竟的几个字节的时候,用sizeof最为安全。这里还是接口的思想哈!!!

第一天,就暂且粗略的写这么多,我,会努力的,知道要成功就要舍弃很多东西,所以才要更加珍惜现在拥有的,更加努力追求我要的,邝小猪,加油!


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值