数据结构
前言
打工人上班摸鱼必备!!!
第一章:绪论
1.1数据结构的基本概念
1.数据元素、数据项:数据元素是数据的基本单位,通常作为一个整体进行处理和考虑。
2.一个数据元素可由若干数据项组成,数据项是构成数据元素的不可分割的最小单位。
3.数据对象:具有相同性质的数据元素的集合,是数据的一个子集。(强调相同性质)
4.数据结构:相互之间存在一种或多种特定关系的数据元素的集合。(强调相互关系)
同样的数据元素,可组成不同的数据结构;
不同的数据元素,可组成相同的数据结构。
1.2数据结构三要素

一、逻辑结构
1.集合:各个元素同属一个集合,别无其他关系。
2.线性结构:数据元素之间是一对一的关系。除了第一个元素,所有元素都有唯一前驱;除了最后一个元素,所有元素都有唯一后继。
3.树形结构:数据元素之间是一对多的关系
4.图状结构:数据元素之间是多对多的关系
二、数据的运算
针对某种逻辑结构,结合实际需求,定义基本运算
1.查找第i个元素
2.在第i个位置插入新的数据元素
3.删除第i个位置1的数据元素
三、物理结构(存储结构)
1.顺序存储:把逻辑上相邻的数据元素存储在物理位置上也相邻的存储单元中。
2.链式存储:逻辑上相邻的元素在物理位置上可以不相邻,借助指针来表示元素之间的存储关系。
3.索引存储:在存储元素信息的同时,还建立附加的索引表。
4.散列存储:根据元素的关键字直接计算出该元素的存储地址,又称哈希(Hash)存储。
1.若采用顺序存储,则各个数据元素在物理上必须是连续的;若采用非顺序存储,则各个数据元素在物理上可以是离散的。
2.数据的存储结构会影响存储空间分配的方便程度。
3.数据的存储结构会影响对数据运算的速度。
运算的定义是针对逻辑结构的,指出运算的功能;
运算的实现是针对存储结构的,指出运算的具体操作。
四、数据类型、抽象数据类型
数据类型是一个值的集合和定义在此集合上的一组操作的总称。
1.原子类型:其值不可再分的数据类型,如bool、int类型。
2.结构类型:其值可再分解成若干分量的数据类型。
1.3 算法的基本概念
一、算法的特性
1.有穷性
2.确定性:算法中的每条指令必须有确切的含义,对于相同的输入只能得到相同的输出。
3.可行性
4.输入、输出:零个或多个输入;一个或多个输出。
二、“好”算法的特质
1.正确性
2.可读性
3.健壮性
4.高效率和低存储量需求
三、算法的时间复杂度
1.加法规则:多项相加,只保留最高阶的项,且系数变为1。
2.乘法规则:多项相乘都保留。

- 顺序执行的代码只会影响常数项,可以忽略。
- 只需挑循环中一个基本操作分析它的执行次数与n的关系即可。
- 有些问题要考虑不同情况下的复杂度。

四、算法的空间复杂度
程序运行时的内存需求:
1.无论问题规模怎么变,算法运行所需的内存空间都是固定的常量,空间复杂度为
S(n) = O(1)
又称算法原地工作——算法所需内存空间为常量
2.算法运行所需内存空间与问题规模相关,如问题规模为n,定义一维数组 flag[n] 或二维数组 flag[n][n]
S(n) = O(n) # flag[n]
S(n) = O(n²) # flag[n][n]
3.函数递归调用也会带来内存开销,函数调用栈中的每一层都需要存储函数中的变量,即
空间复杂度 = 递归调用的深度
第二章:线性表

2.1线性表的定义
线性表是具有相同数据类型的n个数据元素的有限序列,其中n为表长,当n=0时线性表是一个空表。
- 相同数据类型表示每个数据元素所占空间一样大。
- 除第一个元素外,每个元素有且仅有一个直接前驱;除最后一个元素外,每个元素有且仅有一个直接后继。
2.2线性表的基本操作
- InitList(&L):初始化表。构造一个空线性表L,分配内存空间
- DestroyList(&L):销毁操作。释放内存空间
- ListInsert(&L,i,e):插入。在表L的第i个位置上插入指定元素e
- ListDelete(&L,i,&e):删除。删除表L的第i个位置的元素,并用e返回删除元素的值
- LocateElem(L,e):按值查找。在表L中查找具有给定关键字值的元素
- GetElem(L,i):按位查找。获取表L中第i个位置元素的值
- Length(L):求表长。返回线性表L的长度,即L中数据元素的个数
- PrintList(L):输出。按前后顺序输出线性表L的所有元素值
- Empty(L):判空。若L为空表,则返回true
Tips:
1.对数据的操作——创销、增删改查
2.C语言函数的定义—— <返回值类型>函数名(<参数1类型>参数1,<参数2类型>参数2,…)
3.什么时候要传入“&”——引用类型,对参数的修改结果需要“带回来”
2.3顺序表的定义
• 顺序表:用顺序存储的方式实现线性表。
• 顺序存储:把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元 的邻接关系来体现。
2.3.1 顺序表的实现
1.静态分配:存储空间是静态的
#define MaxSize 10 //定义最大长度
typedef struct{
ElemType data[MaxSize]; //用静态的数组存放数据元素
int length; //顺序表的当前长度
}SqlList; //顺序表的类型定义(静态分配方式)
﹡基本使用
#include <stdio.h>
#define MaxSize 10
typedef Struct{
int data[MaxSize];
int length;
}SqlList;
//基本操作——初始化一个顺序表
void InitList(SqlList &L){
for(int i=0; i<MaxSize; i++)
L.data[i]=0; //可省略(若未设置数据元素初始值,可能会被内存中的脏数据覆盖)
L.length=0; //不可省略,避免数据元素被内存中脏数据覆盖
}
int main()
{
SqlList L; //声明一个顺序表
InitList(L); //初始化顺序表
//后续操作
return 0;
}
2.动态分配
#define InitSize 10 //顺序表的初始长度
typedef struct{
ElemType *data; //指示动态分配数组的指针
int MaxSize; //顺序表的最大容量
int length; //顺序表的当前长度
}SeqList; //顺序表的类型定义(动态分配方式)
tips:
C——malloc、free函数(动态申请·和释放内存空间)
L.data = (ELemType*)malloc(sizeof(ElemType) * InitSize);
malloc函数返回一个指针,需要强制转型为所定义的数据元素类型指针
C++——new、delete关键字
*基本使用
#include <stdlib.h> //包含malloc和free函数的头文件
#define InitSize 10 //顺序表的初始长度
typedef struct{
ElemType *data; //指示动态分配数组的指针
int MaxSize; //顺序表的最大容量
int length; //顺序表的当前长度
}SeqList; //顺序表的类型定义(动态分配方式)
void InitList(SeqList &L){
//用malloc函数申请一片连续的内存空间
L.data=(int *)malloc(InitSize*sizeof(int));
L.length=0;
L.MaxSize=InitSize;
}
//增加动态数组的长度
void IncreaseSize(SeqList &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];
2万+


&spm=1001.2101.3001.11974&articleId=125835826&d=1&t=3&u=a86c480e6c3f425fa6e019207aca289e)

被折叠的 条评论
为什么被折叠?



