一、什么是数据结构
1、数据结构的起源
数据结构不是研究数值计算的这些是数学家应该研究的问题,它是研究计算机存储、组织数据的方式问题的学科,数据结构会影响算法的效率,合适的数据结构可以带来更高的运行或存储效率。
1968年,美国的高纳德(Donald E. Knuth)教授《基本算法》,开创了数据结构课程体系的先河。
-
程序设计 = 数据结构 + 算法
凭借一句话获得图灵奖的Pascal之父——Nicklaus Wirth,让他获得图灵奖的这句话就是他提出的著名公式:“算法+数据结构=程序”。
这个公式对计算机科学的影响程度足以类似物理学中爱因斯坦的“E=MC^2”——一个公式展示出了程序的本质。
2、数据结构的基本概念
- 数据(data):所有能输入到计算机中去的描述客观事物的符号
- 数据项(data item):有独立含义的数据最小单位,也称域(field)
- 数据元素(data element):数据结构的基本单位,也称节点(node)或记录(record)
- 数据结构(data structure):数据元素和数据元素关系的集合
- 算法(algorithm):是对特定问题求解步骤的一种描述,是指令的有限序列
#include <stdio.h>
typedef struct Student
{
int id; // 结构成员就是 数据项
char name[20];
char sex;
short age;
float score;
}Student;
int main(int argc,const char* argv[])
{
Student stu = { // 结构变量 stu 是数据元素,负责给他初始化的叫数据
10086,
"hehe",
'w',
23,
88.5
};
// 数据结构
Student stus[5] = {
{10010,"hehe1",'m',18,92},
{10011,"hehe2",'w',18,91},
{10012,"hehe3",'m',17,93},
{10013,"hehe4",'w',18,96},
{10014,"hehe5",'m',15,95},
};
// 算法
for(int i=0; i<5; i++)
{
printf("%d %s %c %hd %g\n",
stus[i].id,
stus[i].name,
stus[i].sex,
stus[i].age,
stus[i].score);
}
}
3、数据结构的三个方面
- 数据的逻辑结构:元素之间具有什么关系。
- 数据的存储结构:元素在内存中如何存储的。
- 数据结构的运算:数据结构应具有的功能或擅长的功能。
二、数据元素之间的逻辑结构有四种基本类型
- 集合:数据元素之间除了同属一个集合外没有其它关系。
- 线性结构:数据元素之间存在一对一的关系,也被称为线性表,简称为表,最具代表性的就是数组、链表。
- 树型结构:数据元素之间存在一对多的关系,如:族谱关系、组织关系。
- 图状结构:数据元素之间存在多对多的关系,如:地铁、高铁线路图。
三、数据结构的存储方式
数据结构在计算机内存中的存储包括数据元素的存储和元素关系的表示。
元素之间的关系在计算机中有两种不同的表示方法,顺序表示和非顺序表示。
1、顺序存储结构
数据存储在一段连续的空间中,用数据元素在存储器中的相对位置来表示数据元素的关系。
优点:随机访问方便,访问效率极高。
缺点:插入删除不方便。
2、链式存储结构
结构中的数据元素存放在彼此独立的地址空间中,每个独立的地址空间称为节点。
在每一个数据元素中增加一个存放另一个元素地址的指针,用来表示数据元素之间的关系。
- 优点:插入删除方便,空间利用率高。
- 缺点:随机访问不方便,只能由前到后逐个访问。
四、逻辑结构和存储结构的关系
数据结构 | 表 | 树 | 图 |
---|---|---|---|
顺序 | 顺序表 | 顺序树 | 矩阵 |
链式 | 链式表 | 链式树 | 邻接表(顺序+链式) |
每种逻辑结构采用何种物理结构实现,并没有明确规定,通常根据实现的难易程度,以及在时间和空间方面的要求,选择最适合的物理结构,也不排除复合多种物理结构实现一种逻辑结构的可能。
五、数据结构的运算
1、建立数据结构:create
2、销毁数据结构:destroy
3、从数据结构中删除一个元素:delete
4、把一个元素插入到一个数据结构中:install
5、访问数据结构中的元素:access
6、修改数据结构中的元素:modify
7、对数据结构中的元素进行排序:sort
8、在数据结构中查找元素:query