编程珠玑 第十三章 习题4 思考
2015-05-23 15:41
183 查看
编程珠玑第十三章 课后习题第4题:为链表重写相应的迭代版本
课后习题给出了如下版本:可以避免对特殊情况的处理
这段程序的关键点在于:
1、当插入节点在首节点,由于p的初始值是&head,因此直接执行
利用node的构造函数,新插入节点的next指针正确了,然后改变*p的值也即改变了head的值,因此head指针也改变了,因此对于这种情况是可以正常处理的。
2、当插入位置不在首节点,在中间某一位置(哨兵是最大值,所有插入节点的值都小于它),因此执行for循环找到第一个大于等于x的节点,若x已在表中,则直接返回。当x不在表中,则执行
是不是感觉很棒!当我理解了这段程序时,真的是有“顿悟”的感觉,大牛给出的代码,要看懂都不容易啊,十分精妙的代码!这也告诉了我,当对代码不理解时,调试一遍说不定能给你启发。
课后习题给出了如下版本:可以避免对特殊情况的处理
void insert2(int x) { node **p; for (p = &head; (*p)->val < x; p = &((*p)->next)) //找到第一个大于等于(*p)->val的节点 ; if ((*p)->val == x) //当已在表中,则直接返回 return; *p = new node(x, *p);//当不在表中,则新建节点 n++; }刚开始我以为这段程序错了,因为感觉它跟一般的遍历插入并无差别,后来经过VS调试程序后,发现原来是我错了。错误的原因应该是对指针的指针理解不够深,因此标记一下,为后来有同样有疑惑的人解惑。
这段程序的关键点在于:
1、当插入节点在首节点,由于p的初始值是&head,因此直接执行
*p = new node(x, *p);
利用node的构造函数,新插入节点的next指针正确了,然后改变*p的值也即改变了head的值,因此head指针也改变了,因此对于这种情况是可以正常处理的。
2、当插入位置不在首节点,在中间某一位置(哨兵是最大值,所有插入节点的值都小于它),因此执行for循环找到第一个大于等于x的节点,若x已在表中,则直接返回。当x不在表中,则执行
*p = new node(x, *p);//当不在表中,则新建节点 n++;这里才是关键点,乍一看觉得这里只改变了新建节点的next域,而前面那个节点并没有把指针指向这个新节点,事实上,错误在于对*p的理解。*p其实是前面那个节点的next域的值,因此这条语句先改变了自己的next指针,然后改变了前驱节点的next指针,因此正确!
是不是感觉很棒!当我理解了这段程序时,真的是有“顿悟”的感觉,大牛给出的代码,要看懂都不容易啊,十分精妙的代码!这也告诉了我,当对代码不理解时,调试一遍说不定能给你启发。
相关文章推荐
- 关于编程珠玑中习题2.3的一点思考
- 关于编程珠玑中习题2.3的一点思考
- 编程珠玑笔记-第13章习题
- 编程珠玑--------第四章习题笔记
- 编程珠玑 第二章 习题5
- 编程珠玑 第一章习题解答
- 编程珠玑之第一章习题6给每个整数不超过10次的100w数据排序的测试用例
- 转-编程珠玑第一章习题9
- 编程珠玑之第二章习题1
- 编程珠玑之第四章习题1
- 编程珠玑第六章习题二——C++实现一个数的因子分解
- 编程珠玑第十三章----查找
- 编程珠玑之第一章习题4: 生成不同的随机顺序的随机整数及存储与读取
- 编程珠玑之第三章习题6
- 编程珠玑之第12章习题1: 随机位问题
- 【编程珠玑】第十三章 搜索
- 编程珠玑之第一章习题3:度量100w整数排序的运行时间
- 编程珠玑之第三章习题3
- 编程珠玑第8章-课后习题10题补充
- 编程珠玑第三章习题5——英语中的连字符问题