1.链表插入时的合适位置寻找问题
《c和指针》给的代码
while( (current=*linkp) != NULL && current->value < value )
linkp = ¤t->link;
书中代码给的提示:把找位置和插入分开。
即把一个整体工作的各个实现细节分开来思考、处理
我写的代码
while( temp->next != NULL ){ //链表遍历(除最后一个节点)
if( temp->value.exp<val.exp && val.exp<temp->next->value.exp ){
buff = temp->next;
temp->next = inVal;
inVal->next = buff;
}
temp = temp->next;
}
if( temp->next == NULL && temp->value.exp < val.exp )//处理最后一个节点的情况
temp->next = inVal;
很明显,我分为了两种情况来处理:
(1) 当前节点为头结点或者中间节点
(2) 当前节点为尾节点
我的思路是:按照目前的算法,列表只要存在就是排好序的,所以要插入一个元素的时候只需要找到前边小于它,后边大于它的位置就可以了。
我与书中做法的差异主要在于两方面:
(1) 书中用了两个缓存变量,而我用了一个(这反映了思路的差异)
(2) 书中的情况只有一个,而我分为了两种情况
而反映在思想方面的差异则是:我是通过当前节点和下一个节点,两个节点的值与插入值比较,而书的则是通过前一个节点;书是找完再插入,我是找到就插入,然而我还忘了跳出循环..
所以说,我的代码不仅看上去更丑陋,而且在编程思想上反映出了更大的缺陷:因为分为很多种情况去解决某个问题往往体现了对问题的认识不够透彻,而且这样做很容易造成漏掉一种情况的尴尬局面。
结论:
(1)各项工作分步骤进行:寻找位置只负责寻找位置,值插入只的负责值插入
(2)尽量抽离出各种情况的共性,避免分太多没必要的情况及其造成的不必要的麻烦
2. 头节点存在意义的讨论
见我的cnblogs博文:《数据结构习题集》所得其一