打字猴:1.70041551e+09
1700415510 在链表的初始状态中,会按照元素在内存上的分布情况设定成员Ptr的值(如图6.11所示)
1700415511
1700415512 图6.11 初始状态的链表中,元素的排列顺序与元素在内存上的物理排列顺序相同
1700415513
1700415514
1700415515
1700415516
1700415517 那么,接下来就是链表的有趣之处了。因为Ptr中存储的是与下一个数组元素的连接信息,所以只要替换了Ptr的值,就可以对数组中的元素排序,使元素的排列顺序不同于其在内存上的物理排列顺序。首先,我们来试着把数组中元素A的Ptr的值改为元素C的地址,然后把元素C的Ptr的值改为B的地址,通过这样的改变,原有的顺序A→B→C就变成了A→C→B(如图6.12所示)
1700415518
1700415519 图6.12 只要改变连接信息,元素就可以呈现出新顺序,不同于其在内存上的物理排列顺序
1700415520
1700415521
1700415522
1700415523
1700415524 为什么说链表很方便呢?请思考一下不使用链表且还要对大量的数据进行排序时应该怎样处理。答案是那就必须要改变元素在内存上的物理排列顺序了。这不仅要改变大量数据的位置,而且程序的处理时间也会变长。如果是使用链表,对元素的排列顺序就只需要变更Ptr的值,程序的处理也会缩短,这个特性也适用于对元素进行删除和插入。在实际的程序中,为了能够处理大量数据,都会在各种各样的情况下灵活运用链表,不使用链表的情况很少见。
1700415525
1700415526 只要明白了链表的构造,也就明白了二叉树的实现方法。在二叉树的实现中,用的还是自我引用的结构体,只不过要改为要带有两个连接信息的成员的自我引用结构体(如代码清单6.11所示)
1700415527
1700415528 代码清单6.11 带有两个链表连接信息的自我引用结构体
1700415529
1700415530 struct TestResult{
1700415531
1700415532   char Chinese;               /*语文成绩*/
1700415533
1700415534   char Math;                  /*数学成绩*/
1700415535
1700415536   char English;               /*英语成绩*/
1700415537
1700415538   struct TestResult* Ptr1;    /*指向其他元素的指针1*/
1700415539
1700415540   struct TestResult* Ptr2;    /*指向其他元素的指针2*/
1700415541
1700415542 };
1700415543
1700415544 二叉树多用于实现那些用于搜索数据的算法,比如“二分查找法”。比起只使用链表,使用二叉树能够更快地找到数据。因为搜索数据时并不是像在简单数组中那样沿一条线搜索,而是寻着二叉树不断生长出来的两根树枝中的某一枝搜索,这样就能更快地找到目标数据了(如图6.13所示)
1700415545
1700415546 图6.13 如果使用了二叉树就能通过更短的路径发现目标数据
1700415547
1700415548
1700415549
1700415550
1700415551 在C语言的学习资料中,会把结构体、指针、自我引用的结构体这些概念放在最后讲解,它们被认为是在C语言的应用中最难理解的部分。如果有偏爱的编程语言,想一想使用偏爱的编程语言如何实现栈、队列、链表和二叉树。无论是哪种编程语言,数据结构的基础都是数组,因此灵活地运用数组是关键。
1700415552
1700415553 通过学习第5章和第6章,相当于上完了算法和数据结构基础这门课程。虽然讲解了各种各样的要点,但在最后还是提醒一点:即使是有了由睿智的学者们提出的那些了不起的算法的数据结构,也不能100%依赖它们。希望要经常自己动脑筋思考算法和数据结构。在了解了典型的算法和数据结构(也就是基础)之后,不要忘记还要灵活地运用它们。只要灵活地去运用典型算法和数据结构,就能创造出出色的原创作品,而能创造出原创作品的程序员才是真正的技术者。
1700415554
1700415555 在第7章,将从各个角度介绍面向对象编程。
1700415556
1700415557
1700415558
1700415559
[ 上一页 ]  [ :1.70041551e+09 ]  [ 下一页 ]