AVLtree感想
让虽然多花了几天,一些看似没必要的debug过程,但是我真的感觉完成这个作业以后我真的开始有自信能自己debug了,因为非常关键的一些都是我自己解决的,而且根据那个一个一个function找应该进入哪里进入哪里,虽然不知道以后用不用得到,但是这个加print statement 看树,比较应该有的结果,和在gdb里看frame, 找到可能出错的地方,能看到具体步骤的地方(remove random 那个for loop)和print random data那个variable,还有在remove里加print tree,这个被叫一次我就要看一次树,所以是在这个方程里,总之我感觉虽然我看似花了很多不必要的时间但是我真的独立自主解决问题的能力和我的自信提升很多,还有我的耐心,有时我的确有快要暴躁的时刻,当我努力全写完了还是找不到问题在哪里不知道要不要大改,但是我真的会佩服自己那样自己一步一步对,发现直到发生错误之前其实都是对的所以才到这一步才开始有问题然后最后那个key mismatch,就像我说的“print the tree before and after the operation that generates this error, manually draw the correct tree after the operation to see how the tree is wrongly arranged, and trace back to all functions that are involved in this operation ”检查所有和错误相关的地方,理解错pseudo code虽然没必要但其实如果我真的认真尝试去理解那个removefix里面就有调整Balance就不会犯这个错误。
看到应该有的没有,然后应该有memory leak,我也形成了这个思维,但是这个错误真的很难找到,尤其有时没显示informative的error message,比如seg fault,(应该有的没有其实是这个)然后valgrind给我new 那个创建动态储存的,真的很难找其实是没有保留住,而不是创建的时候出问题,
还insertfix一开始放在了insert里是没有完全理解这个return value的recursive insert是直到 var = insert()这一行结束才完全完成Insertion,所以不能放在方程里,
最后最最有价值的就是,elon演示的找到一个fram到iterator相关的Loop去step next,,发现起始值是Null,我以前不会找哪里去debug。看他print了一整个data是生成的所有node,给我看,我才知道random也可以去看,然后是ishu还是谁教的直接在.h里print,就是每一次remove 打印一下,才能track每一个function call的变化,,
以及在方程的开始和结尾,打印关键的object property,
然后对error message的敏感性上升了,大概能感知到是哪里出问题,seg fault是dereference null, free()我还真不知道,用的不是我自己写的,额,,
很小的错误是(p)/(!p) 多加少加,
有的CP跟你一个一个对,怀疑你这里出问题那里出问题,但是我有确定的地方,就很没意义,还是自己最了解自己的代码,除了思路问题,基本完成的别人来帮其实不如自己,要获得的帮助其实是往哪里找问题,怎么展现问题相关的信息(gdb 里print一个一个data)了解问题是什么,所有相关的东西哪里出错,嗯嗯。