一.数据结构概述
- 1这个结构能操作什么
- 2放哪里
- 3这么操作他
主要掌握两种结构
- 逻辑结构 :逻辑空间连续(按学号排序)但是不在一个连续的物理空间里面;我们关心元素和元素之间的逻辑关系;用逻辑结构表示物理世界,
- 存储结构:用不同的存储结构来表示相应的逻辑结构
一.1.数据结构的逻辑表示
元素与元素之间的逻辑来分:
1 线性结构
两个相邻元素之间的关系是1:1
2 非线性结构
层级(树状)结构:
元素与元素之间的关系是1:n;
图集关系:
元素与元素之间的关系是n:m;
一.2.存储结构
- 顺序存储和链式存储的区别
我们所写的软件都是在操作系统上面运行的,我们的内存也只是操作系统规划的一篇虚拟内存;(屏蔽了硬件的细节)null是操作系统的无效值;
- 数据的存储方式和操作;
- 顺序存储: 元素在物理上连续;(数组)
- 链式存储: 元素在物理上不连续,但是通过了别的东西进行了逻辑上的连续;
- 常用操作:增删改查;
- 顺序:方便查找(前提是按位置查找)(按值查找低效)
- 链式:方便增删(前提是在一个具体位置进行增删)(按位置增删低效)
比逻辑更加具体可以通过代码实现;
二.线性结构
逻辑描述:
如果一个数据元素排列满足除了第一个和最后一个元素以外,它有一个前驱元素和一个后驱元素,那么它符合线性结构。
顺序表
顺序表的定义:
不同顺序表的区分
- 存储行为:空间是物理连续还是逻辑连续
- 他在哪里(生命周期):它定义的位置(栈,堆,数据区,代码区)
- 栈:由操作系统和编译器决定,不具有动态性,入栈出栈,生命周期:函数内;不能扩容(其实我们main函数里面的所有东西都是在栈中,不过我们有时候是通过指针来修改这个变量的值所以说出了这个函数这个变量的值也会改变
- 堆:由程序员维护,具有动态性,malloc开辟空间free释放空间,能进行扩容,
这个表头类似于vector,vector就是一个表头,它本身就是一个记录首地址的作用。如果这个顺序表里面的数据超过了capacity,那么这个顺序表将要被free,然后再malloc生成一个新的顺序表,把数据存储进去
为什么sizeof的值是24其实这个表头就是三个指针,我们也可以用指针也可以用索引,也可以用int变量来做索引,去查询这个顺序表中的值。
两两配对使用,一个是用来开辟一个是用来释放,
这个结构设计用到了工程师的思想,它没有直接访问那些我们创建的顺序表,而是通过顺序表的一个头结构来进行创建/释放/删除/查询/修改/插入,这样不仅方便了用户,也方便我们进行维护;