第一 数据结构概述与时间复杂度 (ok,上周没写,这周直接跳到数据结构哈哈)
1.为什么要学习数据结构
为了提高程序的运行效率
2.什么是数据?
数据是指对事物的进行的记录并可以鉴别的符号,可以是文字,图片,字母,特殊字符,视频,音频...,对我们有用的信息都可以称为数据。
3.什么是结构?
结构体是指元素(数据)的相互关联和相互作用的关系,比如学生,图书,交通干线等等
4.根据数据元素之间的关系,分成4个基本结构
-
集合:结构中的数据是在同属空间内,没有其它关系,比如刚入学的学生
-
线性结构:数据为一一对应的关系,比如已分发学号的学生,图书馆的图书
-
树状结构(层次关系):数据为一对多的关系,家族的族谱,公司的架构
-
图状结构(网状结构):数据为多对多的关系,城市与城市之间的交通干线
5.什么是数据结构
数据结构体 = 数据+数据与数据之间的关系
6.数据结构的组成部分
-
逻辑结构
-
数据之间的内在关系,通常有集合,线性表(一一对应的关系),树(一对多关系),图(多对多的关系)
-
-
存储结构
-
顺序存储(数组),链式存储(链表),不同的存储方式对数据的处理效率有很大的影响
-
7.时间复杂度
公式:T(n) = O(f(n));
T(n):表示算法的渐进时间复杂度
f(n):程序运行的次数
O:表示正比关系
第二 顺序表
1.线性表
1.概念
一对一的数据所组成的关系称为线性表,注意线性表是逻辑结构
线性表中的数据元素可以是各种各样的,但同一线性表中的元素必定具有相同的特性,即同一数据对象(26个英文字母),相邻的数据之间是一对一的关系,比如B字母节点(数据节点)前面是A字母节点,后面是C字母节点,线性表的特性如下:
(1) 存在唯一的一个被称为"第一个"的数据元素
(2) 存在唯一的一个被称为"最后一个"的数据元素
(3) 处了第一个外,集合中每一个数据元素只有一个前驱节点
(4) 除了最后一个外,集合中每个数据元素均只有一个后驱节点
注意:
1.线性表是一种数据内部的逻辑关系,与存储形式无关
2.线性表既可以采用连续的顺序存储(数组),也可以采用离散的链式存储(链表)
3.顺序表和链表都称为线性表
2.顺序表
1.概念
顺序表:顺序存储的线性表
链式表:链式存储的线性表,简称链表
顺序存储就是将数据存储到一片连续的内存中,在C语言环境下,可以 是具名的栈数组,或者是匿名的堆数组。
存储方式不仅仅只是提供数据的存储空间,而是必须要能体现数据之间 的逻辑关系。当采用顺序存储的方式来存放数据时,唯一能用来表达数据间本身的逻辑关系的就是存储位置。
2.基本操作
1.顺序表设计
一般而言,为了方便操作顺序表,需要一个专门管理顺序表 的"管理结构体",管理结构体一般会包括:
(1) 顺序表总容量
(2) 顺序表当前最末元素下标位置
(3) 顺序表指针
管理结构体示例代码
typedef struct
{
int capacity; // 顺序表容量
int last; // 最末元素下标
int * data; // 顺序表,以整型数据为例
}sequenceList;
初始化
所谓初始化就是建立一个不包含任何元素的顺序表,设置好管理结构体中 的表的总容量、末元素下标,申请好顺序表内存空间等系列准备工作。
下面是初始化顺序表的示例代码:
// 初始化顺序表
sequenceList * init(int cap)
{
sequenceList *s = malloc(sizeof(sequenceList));
if(s == NULL)
return NULL;
s->capacity = cap;
s->last = -1;
s->data = malloc(cap * sizeof(int));
if(s->data == NULL)
{
free(s);
return NULL;
}
return s;
}