一.数据结构的分类

1.逻辑结构:

是指数据对象中数据元素之间的相互关系,也是我们今后最需要关注和讨论的问题
1.1集合结构
1.2线性结构
线性结构中的数据元素之间是一对一的关系
1.3树形结构
树形结构中的数据元素之间存在一种一对多的层次关系
1.4图形结构
图形结构中的数据元素是多对多的关系

2.物理结构:

是指数据的逻辑结构在计算机中的存储形式。
物理结构实际上研究的就是如何把数据元素存储到计算机的存储器中,这里的存储器主要是针对内存而言的。
2.1顺序存储
是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。
例如数组
2.2链式存储
是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。(数据元素的存储关系并不能反映其逻辑关系)

二.算法

特点:有穷性,确定性,可行性,输入,输出
输入:算法具有零个或多个输入
输出:算法至少有一个或多个输出
有穷性:指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成。
确定性:算法的每一个步骤都具有特定的含义,不会出现二义性。
可行性:算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限次数完成。
算法设计的要求
正确性
可读性
健壮性
时间效率高和存储量低

三.时间复杂度和空间复杂度

1.算法效率的度量方法

①事后统计方法

②事前分析估算

2.判断算法的效率:函数中的常数和其他次要项常常可以忽略,而更应该关注主项(最高项)的阶数。

3.大O记法:用大写O()来体现算法时间复杂度的记法,我们称之为大O记法。

如何推导大O阶呢?

①用常数1取代运行次数中的所有加法常数。

②在修改后的运行次数函数中,只保留最高阶项。

③如果最高阶项存在且不是1,则去除与这个项相乘的常数。

4.常见的事件复杂度

数据结构线性表_链表

四.线性表

由零个或多个数据元素组成的有限序列。
线性表下标是从1开始的,不是和数组似的从0开始
**1.数据类型:**是一组性质相同的值的集合及定义在此集合上的一些操作的总称。
例如很多编程语言的整型,浮点型,字符型这些指的就是数据类型。
C语言中的数据类型可以分为两类:
①原子类型:不可以再分解的基本类型,例如整型、浮点型、字符型等。
②结构类型:由若干个类型组合而成,是可以再分解的,例如整型数组是由若干整型数据组成的。
所谓抽象数据类型就是把数据类型和相关操作捆绑在一起。
2.约定:因为数据结构是针对多种语言的,所以要对一些表示方法进行抽象。
ADT:抽象数据类型名
Data:数据元素之间逻辑关系的定义
Operation:操作
endADT
3.线性表的顺序存储结构:指的是用一段地址连续的存储单元依次存储线性表的数据元素。
注意:数组的长度与线性表的当前长度不一样:数组的长度是存放线性表的存储空间的总长度,一般初始化后不变。而线性表的当前长度是线性表中元素的个数,是会变化的。
我们可以随时计算出线性表中任意位置的地址,不管它是第一个还是最后一个,都是相同的时间,那么它的存储时间性能当然就为O(1),我们通常称为随机存储结构。
Status是一个整型,返回1代表OK,返回0代表ERROR
总结:线性表的顺序存储结构在存读数据时,不管是哪个位置,时间复杂度都是O(1)。而在插入或删除时,时间复杂度都是O(n)。这就说明,它比较适合元素个数比较稳定,不经常插入和删除元素,而更多的操作是存取数据的应用
优点:①无须为表示表中元素之间的逻辑关系而增加额外的存储空间
②可以快速地存取表中任意位置的元素
缺点:①插入和删除操作需要移动大量元素。
②当线性表长度变化较大时,难以确定存储空间的容量
③容易造成存储空间的“碎片”
4.链式存储:结点又称为存储映像
注意:无论链表是否为空,头指针均不为空。头指针是链表的必要元素。
5.两种方式的对比
首先从存储方式分配上来说:顺序存储结构用一段连续的存储单元依次存储线性表的数据元素。
链式存储结构用一组任意的存储单元存放线性表的元素。
时间性能方面:查找:顺序存储结构时间复杂度是O(1),单链表是O(n),插入和删除:顺序存储结构需要平均移动表长一半的元素,时间复杂度为O(n),单链表在计算出某位置的指针后,插入和删除时间仅为O(1)。空间性能:顺序存储结构需要预分配存储空间,分大了容易造成空间浪费,分小了容易发生溢出。单链表不需要分配存储空间,只要有就可以分配,元素个数也不受限制。
所以:若线性表需要频繁查找,很少进行插入和删除操作时,宜采用顺序存储结构。若需要频繁插入和删除时,宜采用单链表结构。
顺序表的插入操作时,先进行后挪,找到位置后进行插入,删除操作时直接进行覆盖即可。
6.静态链表(了解)
用数组描述的链表叫做静态链表,这种描述方法叫做游标实现法。这个其实是为了给没有指针的编程语言设计的一种实现单链表功能的方法
对数组的第一个和最后一个元素做特殊处理,他们的data不存放数据。我们通常把未使用的数组元素称为备用链表。数组的第一个元素,即下标为0的那个元素的游标就存放备用链表的第一个结点的下标。数组的最后一个元素,即下标为MAXSIZE-1的游标则存放第一个有数值的元素的下标,相当于单链表的头结点作用。数组的最后一个有值的元素的游标为0(了解了解即可,不是重点)
优点:在插入和删除操作时,只需要修改游标,不需要移动元素,从而改进了在顺序存储结构中的插入和删除操作需要移动大量元素的缺点
缺点:没有解决连续存储分配(数组)带来的表长难以确定的问题,失去了顺序存储结构随机存取的特性。
7.循环链表
之前的单链表,假如不从头结点出发,就无法访问到全部结点
和单链表主要区别:看尾指针是否为null,如果为null就是单链表,如果=head就是循环链表