引子
数据结构的处理方法是从这些具体应用中抽象出共性的数据组织与操作方法,进而采用某种具体的程序设计语言实现相应的数据存储与操作。
利用程序设计语言实现抽象类型的方法:
1. 数据存储
C语言即其他高级语言提供了数据组织的几种基本实现方式,包括数组、链表、结构体等。
数据的存储方法是与要实现的操作密切相关的。
没有最好的存储方式,只有最合适的存储方式。
2. 操作实现
操作的实现需要利用程序设计语言提供的另一个功能,即流程设计功能。
任何高级程序设计语言都提供了一种的基本流程控制语句,即分支控制语句(如 if-else、switch)和循环控制语句(如 for、while、do-while语句)。
分支控制结构、循环控制结构加上程序自然的语句顺序执行结果,是实现任何算法流程的基本结构。
模块化程序设计方法以功能块为单位进行程序设计。
模块化的目的是为了降低程序结构的复杂度,使程序设计、调试和维护等操作简单化。
函数是程序设计语言提供的模块化程序设计的基本手段。
数据存储基础
变量是数据存储的基本单位,而变量是有类型的。
C语言定义了几种基本的数据类型:整型、实现(浮点型)、字符型等。
还提供了构造赋值数据类型的手段,如数组、结构、指针等,为有限能力的程序设计语言表达客观世界中多种多样的数据提供了良好的基础。
数组
数组是最基本的构造类型,它是一组相同类型数据的有序集合。
数组中的元素在内存中连续存放,每个元素都属于同一种数据类型,用数组名和下标可以唯一地确定数组元素。
一维数组定义的一般形式为:
类型名 数组名[数组长度]
数组元素的引用要指定下标,形式为:
数组名[下标]
定义数组是,也可以对数组元素赋值。其一般形式为:
类型名 数组名[数组长度]={初值表};
初值表中依次放着数组元素的初值。
C语言支持多维数组,最常见的多维数组是二维数组,主要用于表示二维表和矩阵。
二维数组的定义形式为:
类型名 数组名[行长度][列长度]
引用二维数组的元素要指定2个下标,即行下标和列下标,形式为:
数组名[行下标][列下标]
二维数组的元素在内存中按行有限方式存放,即先存放第0行的元素,再存放第1行的元素……其中每一行的元素再按照列的顺序存放。
数组的应用离不开循环。
数组具有随机存取元素效率较高的优点,即存取第 i 个元素只需常数时间。也就是说,存取A[i]所需时间与下标 i 无关。
类型定义 typedef
用typedef语句来建立已经定义好的数据类型的别名:
typedef 原有类型名 新类型名
利用typedef来建立基本数据类型的别名能够使得程序具有更好的可阅读性和移植性。
指针
使用指针可以对复杂数据进行处理,能对计算机的内存进行分配控制,在函数调用中使用指针还可以返回多个值。
定义指针变量的一般形式为:
类型名 *指针变量名
指针变量用于存放变量的地址。
定义指针变量时,除了指针变量名,还需要说明该指针变量(如P)所指向的内存空间上所存放数据的类型(如 float)。
指针被定义后,必须将指针和一个特定的变量进关联后,才可以使用指针,也就是说,指针变量也要先赋值再使用,当然指针变量被赋的值应该是地址。
1. 指针的基本运算
通过指针访问变量,这些操作由去地址运算符 & 和间接访问运算符 * 完成。
此外,相同类型的指针还能进行赋值和比较。
指针可以同整数进行加、减操作。
两个类型相同的指针也可进行相减操作,表示两个指针之间相隔的变量个数。
两个相同类型指针还可以使用关系运算符比较大小。
2. 指针与数组
在C语言中,数组名本身就是数组的基地址,即第1个元素(下标为0)的地址。<