数据结构-C 语言
数据结构-C 语言
绪论
数据
-
什么是数据
数据是描述客观事物的数值,
字符以及能输入机器且能被处理的各种符号集合。 -
数据元素
数据元素是组成数据的基本单位,是数据集合的个体。
-
数据项
一个数据元素可以由一个或多个数据项组成,
数据项, 是有独立含义的最小单位,此时的数据元素通常称为记录
-
-
数据对象
性质相同的数据元素的集合,
是数据的子集 -
数据结构
数据结构是相互之间存在一种或多种特定关系的数据元素的集合
数据元素
+ 特定关系 = 数据结构 -
逻辑结构
- 集合结构:
- 集合结构中的数据元素数据元素同属于一个集合
- 数据元素相互之间没有其他关系
- 线性结构: 数据元素之间是一对一的关系
- 树形结构: 数据元素之间存在一种一对的层次关系
- 图形结构: 数据元素之间是多对多的关系
- 集合结构:
-
物理结构
- 定义: 又叫做存储结构,
是值数据的逻辑结构 在计算机中的存储形式
- 数据存储结构: 把数据元素存储再地址连续的存储单元中
- 链式存储结构: 把数据元素放在任意的存储单元里
- 定义: 又叫做存储结构,
-
数据类型
- 计算机中,
内存空间是有限的 - 在
C
语言中, 按照取值的不同, 数据类型分为两类: - 原子型: 不可以再分解的基本类型,
包括整型、实型、字符型等。 - 结构型: 由若干个类型组合而成,
是可以再分解的
- 原子型: 不可以再分解的基本类型,
- 计算机中,
-
抽象数据类型
ADT: Abstract Data Type
- 是对已有的数据类型进行抽象
-
抽象数据类型是值一个数据类型及定义在该模型上的一组操作
typedef 的使用
1 |
// |

1 |
struct Student { |
时间复杂度
1 |
|
1 |
|
1 |
/** |
1 |
/* time = O(logn) */ |
1 |
T(n) = O(f(n)) = O(n) |
T(n)
: 表示代码执行的时间n
: 表示数据规模的大小f(n)
: 表示每行代码执行的次数总和- 因为这是一个公式,
所以用 f(n)
来表示, 公式中的 O
,表示代码的执行时间 T(n)
与 f(n)
表达式成正比
大O
并不具体表示代码真正的执行之间
,代表代码执行时间随数据规模增长的变化趋势
,所以,
线性表
线性表定义:
线性表(Linear List)
n
n>0
,除第一个元素无直接前驱
、最后一个元素无直接后继外
,其余的每个数据元素只有
一个直接前驱和一个直接后继,数据元素之间有一一对应的关系。
线性表的特点:
- 它是一个序列
- 数据元素之间是
有序的
- 数据元素之间是
一对一
的关系
- 数据元素之间是
- 有限性:
线性表的数据元素之间个数是有限的
顺序表中元素存储位置的计算:
-
如果每个元素占用
8
个存储单元, a_i
存储位置是 2000
单元, 则 a_(i+1)
存储位置是? 假设线性表的每个元素需占用
l
个存储单元, 则第 i+1
个数据元素的存储位置和第 i
个数据元素的存储位置之间满足的关系是: LOC(a_(i+1))=LOC(a_1)+l
,由此,所有数据元素的存储位置均可由第一个数据元素的存储位置得到: LOC(a_i)=LOC(a_1)+(i-1)*l
线性表的抽象数据类型
-
线性表的抽象数据类型
-
线性表的顺序结构
线性表的顺序存储结构: 指的是用一段地址连续的存储单元一次存储线性表的数据元素
1
2
3
4
5
6
7
typedef ine ElemType;
typedef struct{
ElementType datas[MAX_SIZE];
int length;
}SeqList;- 存储空间的起始位置: 数组
datas
的存储位置 - 线性表的最大存储容量: 数组长度
MAX_SIZE
- 线性表的当前长度:
length
1
2
3
4
5
6
7
8插入元素:
1. 下标 i 以及下标为 i 以后的所有元素后移
2. 下标 i 的位置放入数据元素 a注意:
1. 插入元素后的顺序表长度变为 n + 1
2. 插入元素后,最后一个元素的下标为 n
3. C语言数组实现时, 顺序表长度不能超过它的最大长度 1
2
3
4将第 i 个数据元素从顺序表 (a_1,...,a_n) 中删除
1. 找到第 i 个位置的数据元素
2. 将第 i 个数据元素以后的数据元素依次覆盖前一个位置
3. 顺序表当前长度减 1 -
链表
-
基本概念
数据域
和指针域
n
头指针
,空
1 |
/*********************************************************************** |
- 不用定义时规定长度
- 存储的元素个数不受限制
插入
和删除
元素时,不用移动
-
链表
-
删除元素
( 改变指向即可
)