diff --git a/.gitignore b/.gitignore index f08278d..3e9d3ed 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -*.pdf \ No newline at end of file +*.pdf +/Code/.vs/ +/Code/x64/ \ No newline at end of file diff --git a/Code/Code.sln b/Code/Code.sln new file mode 100644 index 0000000..374aacd --- /dev/null +++ b/Code/Code.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31205.134 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Code", "Code.vcxproj", "{82E38FA5-0EDC-487C-9E6F-8BFCE2D77216}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {82E38FA5-0EDC-487C-9E6F-8BFCE2D77216}.Debug|x64.ActiveCfg = Debug|x64 + {82E38FA5-0EDC-487C-9E6F-8BFCE2D77216}.Debug|x64.Build.0 = Debug|x64 + {82E38FA5-0EDC-487C-9E6F-8BFCE2D77216}.Debug|x86.ActiveCfg = Debug|Win32 + {82E38FA5-0EDC-487C-9E6F-8BFCE2D77216}.Debug|x86.Build.0 = Debug|Win32 + {82E38FA5-0EDC-487C-9E6F-8BFCE2D77216}.Release|x64.ActiveCfg = Release|x64 + {82E38FA5-0EDC-487C-9E6F-8BFCE2D77216}.Release|x64.Build.0 = Release|x64 + {82E38FA5-0EDC-487C-9E6F-8BFCE2D77216}.Release|x86.ActiveCfg = Release|Win32 + {82E38FA5-0EDC-487C-9E6F-8BFCE2D77216}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {5CDFB3EB-662D-456D-B96A-FC26C765E06A} + EndGlobalSection +EndGlobal diff --git a/Code/Code.vcxproj b/Code/Code.vcxproj new file mode 100644 index 0000000..04d046a --- /dev/null +++ b/Code/Code.vcxproj @@ -0,0 +1,148 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + Win32Proj + {82e38fa5-0edc-487c-9e6f-8bfce2d77216} + Code + 10.0 + + + + Application + true + v142 + Unicode + + + Application + false + v142 + true + Unicode + + + Application + true + v142 + Unicode + + + Application + false + v142 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + false + + + true + + + false + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + + \ No newline at end of file diff --git a/Code/Code.vcxproj.filters b/Code/Code.vcxproj.filters new file mode 100644 index 0000000..9a0b995 --- /dev/null +++ b/Code/Code.vcxproj.filters @@ -0,0 +1,25 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + 头文件 + + + \ No newline at end of file diff --git a/Code/Code.vcxproj.user b/Code/Code.vcxproj.user new file mode 100644 index 0000000..88a5509 --- /dev/null +++ b/Code/Code.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Code/head.h b/Code/head.h new file mode 100644 index 0000000..091a856 --- /dev/null +++ b/Code/head.h @@ -0,0 +1,3 @@ +// ʼ󳤶 +#define MAXSIZE 25 +typedef int element_type; \ No newline at end of file diff --git a/Code/linear_list.c b/Code/linear_list.c new file mode 100644 index 0000000..b76c4ac --- /dev/null +++ b/Code/linear_list.c @@ -0,0 +1,76 @@ +#include +#include +#include "head.h" + +// 静态顺序表 +typedef struct { + element_type data[MAXSIZE]; + int length; +} StaticSequenceList; + +// 动态顺序表 +typedef struct { + element_type *data; + // 已分配的最大容量 + int max_size; + int length; +} DynamicSequenceList; + +// 初始化静态顺序表 +void InitStaticSequenceList(StaticSequenceList* list) { + // 初初始化静态顺序表长度为0 + list->length = 0; +} + +// 初始化动态顺序表 +void InitDynamicSequenceList(DynamicSequenceList* list) { + // 初初始化动态顺序表长度为0 + list->length = 0; + // 申请一片连续的存储空间 + list->data = (element_type*)malloc(MAXSIZE * sizeof(element_type)); + list->max_size = MAXSIZE; +} + +// 分配其他地址增长动态顺序表的数据空间长度 +void OtherIncreaseDynamicSequenceList(DynamicSequenceList* list, int len) { + // 申请一片连续的存储空间 + int new_length = list->max_size + len; + element_type* space = (element_type*)realloc(list->data, new_length); + if (space != NULL) { + list->data = space; + list->max_size += len; + } + else { + list->max_size = 0; + list->length = 0; + printf("分配空间失败!"); + } +} + +// 重新分配地址增长动态顺序表的数据空间长度 +void ReIncreaseDynamicSequenceList(DynamicSequenceList* list, int len) { + // 申请一片连续的存储空间 + int new_length = list->max_size + len; + element_type* space = (element_type*)realloc(list->data, new_length); + if (space != NULL) { + list->data = space; + list->max_size += len; + } + else { + list->max_size = 0; + list->length = 0; + printf("分配空间失败!"); + } +} + +int main() +{ + /*StaticSequenceList static_list; + InitStaticSequenceList(&static_list);*/ + DynamicSequenceList dynamic_list; + InitDynamicSequenceList(&dynamic_list); + printf("%d\n", dynamic_list.max_size); + ReIncreaseDynamicSequenceList(&dynamic_list, 25); + printf("%d\n", dynamic_list.max_size); + return 0; +} \ No newline at end of file diff --git a/Data-Structrue/introduction.md b/Data-Structrue/introduction.md index 1fbb91f..d43ef1b 100644 --- a/Data-Structrue/introduction.md +++ b/Data-Structrue/introduction.md @@ -1,2 +1,115 @@ # 绪论 +## 基本概念 + ++ 数据项:一个数据元素由若干个数据项组成。 ++ 数据元素:组成数据对象的基本单元。 ++ 数据对象:性质相同的数据元素的集合。 + +### 数据类型与抽象数据类型 + +数据类型是一个值的集合和定义在此集合上的一组操作的总称。 + ++ 原子类型:其值不可再分的数据类型。 ++ 结构类型:其值可以再分解为若干成分(分量)的数据类型。 + +抽象数据类型ADT用数学化的语言定义数据的逻辑结构、定义运算。与具体的实现无关。 + +## 数据结构三要素 + ++ 逻辑结构:元素之间的逻辑关系:线性结构、非线性结构 || 集合、线性结构、树结构、网状结构。 ++ 存储结构:数据在计算机中的表示(映像),也称物理结构:顺序存储结构(顺序表)、链式存储结构(链表)、索引存储(索引表)、散列存储(散列表、哈希表)。 ++ 数据运算:运算的定义是针对逻辑结构的,指出运算的功能;运算的实现是针对存储结构的,指出运算的具体操作步骤。 + +## 算法 + +程序=数据结构+算法。算法为了处理信息。 + +### 算法的特性 + ++ 有穷性。 ++ 确定性。 ++ 可行性。 ++ 输入。 ++ 输出。 + +### 好算法的特点 + ++ 正确性。 ++ 可读性。 ++ 健壮性。 ++ 高效率与低储量需求。 + +### 效率度量 + +#### 时间复杂度 + +时间开销$T(n)$与问题规模$n$的关系。 + +当n规模够大时可以只考虑阶数高的部分。即$T(n)=O(T(n))$。 + ++ $T(n)=f(n)+g(n)=O(f(n))+O(g(n))=O(\max(f(n),g(n)))$。多项相加只保留最高阶的项,系数为1。 ++ $T(n)=f(n)×g(n)=O(f(n))×O(g(n))=O(\max(f(n)×g(n)))$。多项相乘就都保留。 ++ $O(1) 1) { + check(n-1) + } +} +check(n); +``` + +此时每一次的递归会使变量空间减去1,所以$S(n)=S((1+n)n/2)=O(n^2)$。 diff --git a/Data-Structrue/linear-list.md b/Data-Structrue/linear-list.md new file mode 100644 index 0000000..8d6454c --- /dev/null +++ b/Data-Structrue/linear-list.md @@ -0,0 +1,111 @@ +# 线性表 + +## 基本概念 + +### 逻辑结构 + +是具有相同数据类型的n个数据元素的有限序列。n表示表长。 + +$L=(a_1,a_2,\cdots,a_i,\cdots,a_n)$,其中$i$表示元素在线性表中的位序,从一开始。 + ++ 存在惟一的第一个元素。 ++ 存在惟一的最后一个元素。 ++ 除第一个元素之外,每个元素均只有一个直接前驱。 ++ 除最后一个元素之外,每个元素均只有一个直接后继。 + +### 物理结构 + ++ 顺序存储结构:顺序表。 ++ 链式存储结构:链表。 + +## 顺序表 + +把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来实现。 + +### 定义 + +使用C语言的结构体定义顺序表,使用`typedef`定义一个ElemType表示数据基本类型,并定义最大长度MaxSize: + +可以使用静态分配空间: + +```c +// 静态顺序表 +typedef struct { + ElemType data[MaxSize]; + int length; +} StaticSequenceList; +``` + +也可以使用动态分配空间: + +```c +// 动态顺序表 +typedef struct { + element_type *data; + // 已分配的最大容量 + int max_size; + int length; +} DynamicSequenceList; +``` + +max_size表示动态顺序表当前可以使用的最大存储空间。 + +### 特点 + +1. 随机访问,可以在$O(1)$时间内找到对应元素。 +2. 存储密度高,只用存储数据。 +3. 拓展容量不方便。 +4. 插入删除操作不方便。 + +### 操作 + +#### 初始化 + +```c +// 初始化静态顺序表 +void InitStaticSequenceList(StaticSequenceList* list) { + // 初初始化静态顺序表长度为0 + list->length = 0; +} +``` + +静态顺序表因为数组部分在创建时就已经设置好了,所以初始化就直接设置数据长度就可以了。 + +```c +// 初始化动态顺序表 +void InitDynamicSequenceList(DynamicSequenceList* list) { + // 初初始化动态顺序表长度为0 + list->length = 0; + // 申请一片连续的存储空间 + list->data = (element_type*)malloc(MAXSIZE * sizeof(element_type)); + list->max_size = MAXSIZE; +} +``` + +动态顺序表不仅需要设置数据长度与最大长度,还得分配数组初始空间。 + +#### 增长数据空间长度 + +只有动态顺序表才能增加。 + +```c +// 增长动态顺序表的数据空间长度 +void IncreaseDynamicSequenceList(DynamicSequenceList* list, int len) { + // 申请一片连续的存储空间 + int new_length = list->max_size + len; + element_type* space = (element_type*)realloc(list->data, new_length); + if (space != NULL) { + list->data = space; + list->max_size += len; + } + else { + list->max_size = 0; + list->length = 0; + printf("分配空间失败!"); + } +} +``` + +#### 插入 + +插入时间复杂度为:$T(n)=O(n)$,空间复杂度为$S(n)=O(1)$。