笔记结构算法数据结构和算法
小楼夜听雨启
数据结构

逻辑结构:集合,线性结构,树形结构,图状(网状)结构
存储结构:顺序储存,链式储存,索引储存,散列储存
算法

时间复杂度
计算时间复杂度主要看循环,加法就保留高阶的,乘法就相乘


空间复杂度
算法的空间复杂度主要看循环,数据类型的变量,递归,同样加法就保留高阶的,乘法就相乘
空间复杂度=递归调用的深度

线性表
定义:相同数据类型的n个数据元素的有限序列
表示:L=(a1,a2,a3….,an)
位序:从1开始,不是从0开始,除了第一个元素外,每个元素都有1个直接前驱,直接后续同理
操作:
顺序表
顺序表:使用顺序储存的方式实现的线性表(物理位置)
实现方式——静态分配(数组),创建包含数组和数组当前长度的变量的结构体来实现
注意:如果不初始化为0,那么打印的时候可能会打印脏数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| #include<iostream> #include<string> using namespace std; #define MaxSize 10
typedef struct SqList { int data[MaxSize]; int length; };
void List(SqList& L) { for ( int i=0; MaxSize <i ; i++) { L.data[i] = 0; L.length = 0; } }
int main() { SqList L; List(L); for (int i = 0; i < L.length; i++) { printf("data[%d]=%d\n", i, L.data[i]); } return 0; }
|
动态分配
开辟新的空间,并将原来空间的数据复制过去
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| #include<iostream> #include<string> using namespace std; #define MaxSize1 10
typedef struct SqList { int *data; int MaxSize; int length; };
void List(SqList& L) { L.data = (int*)malloc(MaxSize1 * sizeof(int)); L.length = 0; L.MaxSize = MaxSize1;
}
void addList(SqList& L,int len) { int* p = L.data; L.data = (int*)malloc((L.MaxSize+len) * sizeof(int)); for (int i = 0; i < L.length; i++) { L.data[i] = p[i]; } L.MaxSize = L.MaxSize + len; free(p);
}
int main() { SqList L; List(L); addList(L, 5); L.data[0] = 100; L.length = 1; for (int i = 0; i < L.length; i++) { printf("data[%d]=%d\n", i, L.data[i]); } return 0; }
|

添加数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
bool add_content(SqList& L, int i, int e) { if (i>=L.length+1 || i < 1) { return false; }; if (i == L.MaxSize) { return false; }; for (int j =L.length;i<=j; j--) L.data[j] = L.data[j-1]; L.data[i - 1] = e; L.length++; return true; }
int main() { SqList L; List(L); addList(L, 5); L.data[0] = 100; L.data[1] = 200; L.data[2] = 300; L.data[3] = 400; L.data[4] = 500; L.length = 5; add_content(L, 1, 1); add_content(L, 6, 2); add_content(L, 6, 3); add_content(L, 6, 4); add_content(L, 6, 5); for (int i = 0; i < L.length; i++) { printf("data[%d]=%d\n", i, L.data[i]); } return 0; }
|
删除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| bool deleteList(SqList& L, int i, int &e) { if (i >= L.length || i < 1) { return false; }; if (i == L.MaxSize) { return false; }; e = L.data[i - 1]; for (int j = i; j < L.length;j++) { L.data[j - 1] = L.data[j]; } L.length--; return true;
|
专升本
绪论
考点:
- 数据结构相关概念和术语
- 数据结构的三要素:逻辑结构,物理结构,数据运算
- 时间和空间复杂度的计算和分析
数据结构基本概念
数据:是信息的载体,能被计算机识别和处理
数据元素:是数据的基本单位,数据项是构成数据元素的最小单位:如学生信息是数据元素,由学号,姓名等数据项组成
数据对象:是相同性质的数据元素组成,是数据的一个子集,如:全班学生
数据类型:
原子类型:值不可再分的数据类型
结构类型:值可以再分的数据类型
抽象数据类型:描述数据的逻辑结构和抽象运算,常用(数据对象,数据关系,基本操作集)这样的三元组表示,构成一个完整的数据结构定义
数据结构:
逻辑结构:线性结构,非线性结构(集合,树,网)
物理(储存)结构:数据元素和关系,是用计算机语言实现的逻辑结构
顺序储存:内存是是连续的(顺序表,循环队列)
链式储存:内存上不一定连续,但是可以指向下一个的地址(单链表)
索引储存:有索引表,通过key索引到内容的地址
散列储存:通过函数计算出地址(哈希表)
数据运算
顺序表
数组