众所周知,著名计算机科学家n.wirth提出过这样一个公式:算法+数据结构=程序.他不仅指出了数据结构在计算机科学中的地位,也指出了它与算法的密切联系:算法与数据结构是相辅相成.缺一不可的两个方面。
数据结构也叫信息结构,讨论的是数据的组织问题.而我们常用的整型.浮点型等类型的数据,都属于静态数据,他们的存储空间在程序执行过程中不能加以改变,因此被称为静态数据结构。
但是,在我们实际的程序设计中,经常遇到这种问题:要用一种结构存储一组数据,但又不知道随着程序的执行而存入的这组数据的大概数目, 若按照估计的数目用数组来存取这组数据的话,数目估计过大则会浪费了大量的存储空间, 但要是数目估计过小就又会引发错误导致程序停止运行;再者, 在程序运行中时常需要在结构的某个位置删除或插入一些数据,于是会造成大规模的数据的频繁的移动, 加大了算法的复杂度. 可见这个问题触及到了计算机世界中最宝贵的时间和空间资源,吃尽了苦头的人们于是找到了一种比较好的解决方法。
这个方法就是将此结构在物理上分散存储,而在逻辑上形成一个完整的结构。通俗一点说就是把整个结构中的一个一个数据,在物理上分别存储在许多不同的储存块里,这就可以很灵活地随时删除或加入新的数据,而不必事先知道结构的大小,可见解决了"空间"问题;不仅如此, 还要设法通过某种联系把这些分散的数据组织起来成为一个逻辑上完整的结构,这样, 添加或删除数据时只需改变一下数据之间的联系就可以了,不会造成大量数据的频繁移动,从而增加了效率又解决了"时间"问题.可见,这是一个不错的解决方案,如何在程序设计中实现这个方案呢? 我们把结构存储每个数据的存储块称作"表结点",并把表结点内部设计成两个部分,一部分存储数据,另一个部分存储下一个表结点的内存地址,这样,我们只要有第一个表结点的地址,就可以一下子将整个结构像链条一样"拎"起来了。这是一种常用的动态数据结构,它的名字就形象地叫做"链表"。
链表是用指针(指向下一个表结点的内存地址)串起来的,而指针是许多高级语言如pascal.c.c++等,都具有的一种有效的重要的特殊的数据类型。 许多较为高级或实用的动态数据结构(如链表.树等)都或多或少地使用了指针。 但由于指针涉及到了计算机的内存管理,其巨大的灵活性是一把锋利的"双刃剑",造成了大量的不易找出的程序错误,甚至严重到破坏系统代码。因此,新的高级语言java中用"引用"取代了指针。这是附带的议论。搁在一边,暂且不提。但为了便于读者理解,我还是以"指针"来诠释动态数据结构。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器