1 数据管理的方式
假设我们要开发一个图书馆管理系统,图书馆里有1000本图书,我们要开发一个“图书检索”的功能,要求输入图书名称,可以查找到该图书的信息。
那么,这个功能怎么样实现?
经过前面的学习,掌握了C语言的基础语法之后,我们可以通过C语言来解决这个问题。但是,要怎么样实现?
首先,我们要在1000本图书里查找数据,那么,就需要知道1000本图书的数据是怎么样存储,了解了存储规则之后,才可以设计算法来查找图书。
此时,我们提出一个问题:数据存储的方式。
我们可以想到一种最简单的方式:把1000本图书的信息,存放到一个数组中,数组的元素是一个结构体类型。那么,使用一个结构体数组,就可以存放1000本图书的信息。这就是一种数据存储的方式。
如果使用数组来存储数据,那么,查找数据的时候,我们遍历数据就可以了。所以,确定了数据存储的方式之后,才可以设计查找算*功法**能,进行更加复杂的软件设计。
下面我们将介绍两种最常用的数据存储方式:顺序表和链表。
2 顺序表和链表
结构体是C语言中非常重要的一个知识点。它能够表达一个物体由哪些属性组成,清晰地表示一个物体。例如一本图书,它的信息有:书名、作者、出版社等等这些信息。
那么,在C语言中怎么样表示一本图书的信息,就可以使用结构体来实现。很多资料都说指针是C语言的灵魂,那么,我认为结构体就是C语言的肉体。指针和结构体就创建了C语言这把利剑,可以披荆斩棘。
当我们学习了C++之后,C++的类其实就是C语言中结构体和指针的结合使用。在我们的httpd服务器项目中,就是使用C语言来实现OOP(面向对象)编程,通过结构体和指针,实现面向对象编程。
面向对象编程是一种思想,不在乎使用哪种编程语言实现。在实际开发的过程中,我们建议使用面向对象的编程思想来设计程序,这样,程序的设计才可以提高一个层次。
3 顺序表
我们学习了数组,知道数组就是一段内存块,例如:
int a[8];
此时,定义了一个int类型的数组,数组的容量是8个元素,那么,在内存中,分配如下的内存块:

可以看到,申请了一段连续的内存块,该内存块可以存放8个元素。每个元素是int类型的变量。如果我们想访问第 6 个元素,那么,就是访问数组下标为5(数组下标从0开始计算)的元素。
所以,通过数组下标5,可以指定访问a[5]元素。这就是数组可以随机访问指定某个元素的特性。通过数组下标,可以随机访问指定的数组元素。
现在,我们先来看看一个顺序表操作的例子,然后,再总结顺序表操作的特性。程序测试代码如下:



可以看到,我们定义的顺序表,就是一个数组:
struct node sets[16];
数组的元素类型,就是我们定义的struct node结构体类型。
那么,我们可以总结顺序表的特点:
(1) 顺序表存放数据的空间,是一段连续的内存块,可以如同数组一样访问;例如,我们定义的sets[ ]数组,就是一段连续的内存块。
(2) 顺序表支持随机访问指定的元素,而且可以快速访问;例如,我们可以通过数组的下标,快速访问某一个数组元素。
使用顺序表的缺点是:需要预先定义好一段内存块,例如:
struct node sets[16];
此时,预先定义了16个元素的数组。那么,如果我们只是使用了3个元素,那么,剩下的13个元素的内存空间就被浪费了。
而且,当我们需要存储的数据超过16个元素,超出数组内存空间,就无法放下新的元素。
所以,我们可以使用数组来定义一个顺序表。使用数组可以有效地管理数据的存储。支持数据元素的增加、删除、修改。