数据结构与算法
文章平均质量分 69
依据《数据结构》严蔚敏版,陆续更新,记录学习过程。
Traving Yu
这个作者很懒,什么都没留下…
展开
-
基数排序C/C++代码实现
链式基数排序:分配类排序不需要比较关键字的大小,它 是根据关键字中各位的值,通过对待排序记录进行若干趟 “ 分配 ” 与 “ 收集” 来实现排序的,是一种 借助于多关键字排序的思想对单关键字排序的方法。基数排序(RadixSorting)是典型的分配类排序算法属性:时间复杂度为O(n)空间复杂度为O(n+ rd),(假设每个记录含d个关键字,每个关键字的取值范围为rd个值)。稳定排序。基数排序使用条件有严格的要求:需要知道各级关键字的主次关系和各级关键字的取值范围。代码如下:#inclu原创 2020-07-08 17:24:28 · 4176 阅读 · 1 评论 -
归并排序C/C++代码实现
举例:归井排序(MergingSort)就是将两个或两个以上的有序表合并成一个有序表的过程。将两个有序表合并成一个有序表的过程称为2-路归井算法属性:时间复杂度为O(nlog2(n))。空间复杂度为O(n)稳定排序。归并多用于外部排序。代码如下:#include<stdio.h>#define MAXSIZE 20typedef int KeyType;typedef int InfoType;//记录类型typedef struct { KeyType key;原创 2020-07-08 15:53:50 · 3056 阅读 · 0 评论 -
堆选择排序C/C++代码实现
举例:树形排序即简单选择排序的改进,第一躺比较后对记录大小进行记录,以后不再逐一比较,堆排序 (Heap Sort) 是一种树形选择排序。堆实质上是满足如下性质的完全二叉树:树中所有非终端结点的值均不大于(或不小于) 其左、 右孩子结点的值。步骤:1,按堆的定义将待排序序列r[l…n]调整为大根堆(这个过程称为建初堆),交换r[l]和r[n] , 则r[n]为关键字最大的记录。2,将r[l . .n-1]重新调整为堆,交换r[I]和r[n-1], 则r[n-1]为关键字次大的记录。 3,循环n-原创 2020-07-07 19:40:03 · 254 阅读 · 0 评论 -
简单选择排序C/C++代码实现
举例:选择排序的基本思想是:每一趟从待排序的记录中选出关键字最小的记录,按顺序放在已排序的记录序列的最后,直到全部排完为止。括号内为已排完序的,每一趟结束待排序记录的个数就少一个。算法属性:时间复杂度为O(n^2)空间复杂度为O(1)根据“交换记录” 的策略不同可是稳定的排序,也可能是不稳定的排序。移动记录次数较少,当每一记录占用的空间较多时,此方法比直接插入排序快。另外:简单选择排序和堆选择排序不受初始序列顺序影响。代码如下:#include<stdio.h>#def原创 2020-07-07 16:29:52 · 2404 阅读 · 1 评论 -
快速交换排序C/C++代码实现
举例:快速排序(QuickSort) 是由冒泡排序改进而得的,选取一个记录作为枢轴(通常取第一个记录)一次性把小于的全冒到左边,然后对左右两边递归。快速排序方法中的一次交换可能消除多个逆序。low和high两个指针轮流进行移动交换。算法属性:时间复杂度为O(nlog2(n))。空间复杂度最坏情况为O(n)不稳定排序。适合用于顺序结构,很难用于链式结构。当n较大时,在平均情况下快速排序是所有内部排序方法中速度最快的一种,所以其适合初始记录无序、n较大时的情况。代码实现:#includ原创 2020-07-07 11:43:51 · 537 阅读 · 0 评论 -
冒泡交换排序C/C++代码实现
举例:通过两两比较相邻记录的关键字, 如果发生逆序,则进行交换。每进行一趟确定一个最大关键字的位置,其结果记录被安置到最后一个记录的位置上。 直到算法没有进行过交换记录的操作表示排序结束。算法属性:时间复杂度为O(n^2)空间复杂度为O(1)稳定排序。当初始记录无序,n较大时,此算法时间复杂度较高,不宜采用代码如下:#include<stdio.h>#define MAXSIZE 20typedef int KeyType;typedef int InfoType;原创 2020-07-07 11:19:20 · 205 阅读 · 0 评论 -
希尔插入排序C/C++代码实现
举例:希尔排序是跨度大一点的直接插入排序,直接插入排序可以看成一趟增量是 1 的希尔排序。算法属性:时间复杂度取决于所选取的增量序列。空间复杂度为O(1)不稳定排序。只能用于顺序结构,并且最后 一个增量值必须等于1。适合初始记录无序、n较大时的情况。代码实现:#include<stdio.h>#define MAXSIZE 20typedef int KeyType;typedef int InfoType;//记录类型typedef struct { KeyT原创 2020-07-06 14:27:36 · 230 阅读 · 0 评论 -
折半插入排序C/C++代码实现
折半插入排序就是查找操作使用折半查找的直接插入排序,除此之外它与直接插入排序基本一样。算法属性:时间复杂度为O(n^2)空间复杂度为O(1)稳定排序。因为要进行折半查找, 所以只能用于顺序结构。适合初始记录无序,n较大时的情况。代码如下:#include<stdio.h>#define MAXSIZE 20typedef int KeyType;typedef int InfoType;//记录类型typedef struct { KeyType key; Inf原创 2020-07-02 11:47:28 · 709 阅读 · 0 评论 -
直接插入排序C/C++代码实现
举例:时间复杂度为O(n^2)空间复杂度为O(1)代码如下:#include<stdio.h>#define MAXSIZE 20typedef int KeyType;typedef int InfoType;//记录类型typedef struct { KeyType key; InfoType otherinfo;}RedType;//顺序表类型typedef struct { RedType r[MAXSIZE + 1]; //r[0]闲置或作哨兵原创 2020-07-02 11:15:07 · 552 阅读 · 0 评论 -
哈希表(散列表)C/C++代码实现
哈希表(散列表):1,构造散列函数最常用的方法是除留余数法:H(key) = key%p这个方法的关键是选取适当的p, 一般情况下,可以选p为小于表长的最大质数。例如表长m=100, 可取p=97。2,处理冲突选择一个 “好” 的散列函数可以在一定程度上减少冲突,但在实际应用中,很难完全避免发生冲突1,开放地址法(1)线性勘测法(2)二次探测法(3)伪随机探测法线性探测法的优点是:只要散列表未填满,总能 找到一个不发生冲突的地址。缺点是:会产生 ”二次聚集“ 现象。而二次探测法和伪随机原创 2020-06-30 16:17:10 · 15151 阅读 · 5 评论 -
B-树C/C++代码实现
此坑待填!!!原创 2020-06-30 11:30:25 · 168 阅读 · 0 评论 -
平衡二叉树C/C++代码实现
此坑待填!!!原创 2020-06-30 11:28:29 · 336 阅读 · 0 评论 -
二叉排序树C/C++代码实现
二叉排序树(二叉查找树):二叉排序树的一个重要性质:中序遍历一棵二叉 树时可以得到一个结点值递增的有序序列。对于需要经常进行插入、 删除和查找运算的表,采用二叉排序树比较好查找:若二叉排序树为空,则查找失败,返回空指针。若二叉排序树非空,将给定值key与根结点的关键字T->data.key进行比较:1,若key等于T->data.key , 则查找成功,返回根结点地址;2,若key小于T->data.key, 则递归查找左子树;3,若key大于T->data.key原创 2020-06-29 16:15:12 · 3111 阅读 · 1 评论 -
分块查找C/C++代码实现
分块查找(索引顺序查找):这是一种性能介于顺序查找和折半查找之间的一种查找方法,是顺序查找和折半查找两种算法的简单合成。块内无序,块间有序所谓 “分块有序” 指的是第二个子表中所有记录的关键字均大于第一个子表中的最大关键字,第三个子表中的所有关键字均大于第二个子表中的最大关键字。算法适用情况:由于块内是无序的,故插入和删除比较容易,无需进行大量移动。 如果线性表既要快速查找又经常动态变化,则可采用分块查找。使用条件:线性表必须要能实现分块之间有序。代码如下:#include<stdi原创 2020-06-28 19:24:13 · 6072 阅读 · 1 评论 -
折半查找C/C++代码实现
折半查找(二分查找):折半查找的查找过程为:从表的中间记录开始,如果给定值和中间记录的关键字相等, 则查找成功;如果给定值大于或者小于中间记录的关键字, 则在表中大于或小于中间记录的那一半中查找,这样重复操作, 直到查找成功,每一次查找比较都使查找范围缩小一半。例如:把当前查找区间的中间位置作为根,树中每一结点对应表中一个记录,但结点值不是记录的关键字,而是记录在表中的位置序号,由此得到的二叉树称为折半查找的判定树故根据树的性质:折半查找在查找不成功时和给定值进行比较的关键字个数最多也不超过lo原创 2020-06-28 14:16:18 · 4593 阅读 · 1 评论 -
顺序查找C/C++代码实现
设置哨兵的顺序查找:顺序查找(SequentialSearch)的查找过程为:从表的一端开始,依次将记录的关键字和给定 值进行比较,若某个记录的关键字和给定值相等,则查找成功。如果不设置哨兵在每次都需要比较是否查找完成,而在0号位设置哨兵可以免去查找过程中每一 步都要检测整个表是否查找完毕,大幅度提高算法效率。算法效率:时间复杂度为O(n)既适用于顺序结构, 也适用链式结构,但当n很大时, 不宜采用顺序查找。代码如下:#include<stdio.h>#include<st原创 2020-06-28 13:50:28 · 8974 阅读 · 1 评论 -
图的关键路径C/C++代码实现
AOE-网:AOE-网 (Activity On Edge) , 即以边表示活动的网。 AOE-网是一个带权的有向无环图, 其中顶点表示事件, 弧表示活动, 权表示活动持续的时间。关键路径:要估算整项工程完成的最短时间, 就是要找一条从源点到 汇点的带权路径长度最长的路径, 称为关键路径 (Critical Path)。关键路径上的 活动叫做关键活动,这些活动是影响工程进度的关键, 它们的提前或拖延将使整个工程提前或拖延。其关键路径为:关键路径有两条: (v0, v1,v4,v6, v8)或(原创 2020-06-22 11:30:17 · 1793 阅读 · 1 评论 -
图的拓扑排序C/C++代码实现
AOV-网:一个无环的有向图称作有向无环图(Directed Acycline Graph), 简称DAG图。用顶点表示活动,用弧表示活动间的优先关系的有向图称为顶点表示活动的网(Activity On Vertex Netwrok) ,简称AOV-网拓扑排序:所谓拓扑排序就是将AOV-网中所有顶点排成一个线性序列。作用:可用来判断图或网中是否有环。检测的办法是对有向图的顶点进行拓扑排序,若网中所有顶点都在它的拓扑有序序列中,则该AOV-网中必定不存在环,否则有环。除了用拓扑排序判断图有无环外,原创 2020-06-21 17:25:47 · 1549 阅读 · 0 评论 -
图的最短路径之Floyd算法C/C++代码实现
弗洛伊德Floyd算法:也称插点法,该算法用来求解每一对顶点之间的最短路径假设从顶点1到2,顶点3为过度中间顶点则:如果某个顶点位于从起点到终点的最短路径上:1->2=(1->3)+(3->2)如果某个顶点不在从起点到终点的最短路径上:1->2<(1->3)+(3->2)总结:从i号顶点到j号顶点只经过前k号点的最短路径以该图为例:辅助数组的变化过程:代码如下:#include<stdio.h>#define MaxInt原创 2020-06-21 12:39:31 · 1880 阅读 · 0 评论 -
图的最短路径之Dijkstra算法C/C++代码实现
迪杰斯特拉Dijkstra算法:该算法用来求解从某个源点到其余各顶点的最短路径以该图为例:其邻接矩阵为:最短路径为:具体过程:算法中用到了三个辅组数组:S[i]:布尔值记录到顶点最短路径是否已经被确定Path[i]:记录顶点最短路径的直接前驱顶点序号D[i]:记录最短路径的长度,初值为权值(上表中的i表示循环次数)每次从D数组中选择最小的加入到S集合,紧接着用刚加入的顶点和个顶点比较如果路径变小了则更新相应D数组代码如下:#include<stdio.h>原创 2020-06-21 10:01:01 · 3386 阅读 · 0 评论 -
图的最小生成树之Kruskal算法C/C++代码实现
克鲁斯卡尔Kruskal算法 :1,该算法用到了排序算法,要求辅助数组按权值大小排序,代码中使用直接插入排序算法。2,另外还需设置一个连通分量辅助数组,用来标识两个顶点是否在同一连通分量,因为我们要选择的是最小权值的边且边连接的两个顶点在不同连通分量的边。该算法也称“加边法”,所以克鲁斯卡尔算法更适合于求稀疏网的最小生成树。还用上篇文章所用的图为例:代码如下:#include<stdio.h>#define MaxInt 9 //定义无穷大,这里设置一个比所有边的权值都大的数原创 2020-06-20 11:16:28 · 1767 阅读 · 2 评论 -
图的最小生成树之Prim算法C/C++代码实现
最小生成树:在一个连通网的所有生成树中,各边的代价之和最小的那棵生成树称 为该连通网的最小代价生成树 (Minimum Cost Spanning Tree), 简称为最小生成树。一棵有n个顶点的生成树有且仅有n-1条边。普里姆Prim算法 :该算法也称“加点法”,即在辅助数组中选择权值最小的顶点加入点集合U,并用刚选择的顶点更新辅助数组中到各顶点的权值。注:该算法与网中的边数无关, 因此适用于求稠密网的最小生成树。以该图为例:辅助数组如下表(k为顶点在数组中的下标):代码如下:(下面原创 2020-06-19 19:15:59 · 1944 阅读 · 0 评论 -
邻接表无向图的广度优先遍历C/C++代码实现
广度优先遍历:与深度优先遍历不同,广度优先遍历还需要一个辅助队列,用来按顺序存储遍历过的顶点以便出队的顶点总是先被遍历的顶点。以该图为例:代码如下:#include<stdio.h>#define MVNum 100typedef char OtherInfo;typedef char VerTexType;//邻接表存储结构 typedef struct ArcNode //边结点{ int adjvex; struct ArcNode *nextarc;原创 2020-06-14 14:41:03 · 3211 阅读 · 0 评论 -
邻接矩阵无向图的广度优先遍历C/C++代码实现
广度优先遍历:与深度优先遍历不同,广度优先遍历还需要一个辅助队列,用来按顺序存储遍历过的顶点以便出队的顶点总是先被遍历的顶点。以该图为例:代码如下:#include<stdio.h>#define MaxInt 0#define MVNum 100typedef char VerTexType; //顶点类型typedef int ArcType; //边权值类型//邻接矩阵存储结构typedef struct{ VerTexType vexs[MVNum]原创 2020-06-14 14:30:36 · 2247 阅读 · 0 评论 -
邻接表无向图的深度优先遍历C/C++代码实现
图的链式存储:图的链式存储有多种,有邻接表、十字链表和邻接多重表,下面注意说明邻接表。邻接表:邻接表由两部分组 成:表头结点表和边表。例:深度优先遍历:为了避免同一顶点被访问多次,在遍历图的过程中,必须记下每个已访问过的顶点。 为此,设一 个辅助数组visited[n] , 其初始值置为"false"或者0, 一旦访问了顶点V, 便置visited[i]为"true" 或者1。以该图为例:代码如下:#include<stdio.h>#define MVNum 100原创 2020-06-14 14:04:44 · 5497 阅读 · 1 评论 -
邻接矩阵无向图的深度优先遍历C/C++代码实现
图的顺序存储:图没有顺序存储结构,但可以借助二维数组来表示元素 之间的关系,即邻接矩阵表示法。用邻接矩阵表示法表示图,除了一个用千存储邻接矩阵的二维数组外, 还需要用一个一维数 组来存储顶点信息。深度优先遍历:为了避免同一顶点被访问多次,在遍历图的过程中,必须记下每个已访问过的顶点。 为此,设一 个辅助数组visited[n] , 其初始值置为"false"或者0, 一旦访问了顶点V, 便置visited[i]为"true" 或者1。以该图为例:代码如下:#include<stdio原创 2020-06-14 10:54:55 · 4350 阅读 · 0 评论 -
哈夫曼编码C/C++代码实现
哈夫曼编码的特点:因为哈夫曼树的特点是:叶子结点权值越大的,离根越近。又因为构造不等长编码的原则是:字符使用频率越高,编码越短,故采用哈夫曼树进行编码可以得到最优前缀编码。约定左分支标记为0, 右分支标记为 1求哈夫曼编码:为不浪费存储空间,动态分配一个长度为n(字符编码长度一定小于n) 的一维数组cd, 用来临时存放当前正在求解的第i个字符的编码,当第i个字符的编码求解完毕后,根据数组cd的字符串长度分配HC[i]的空间,然后将数组cd中的编码复制到HC[i]中。依照上一篇文章的哈夫曼树:哈原创 2020-06-10 17:56:51 · 6173 阅读 · 4 评论 -
哈夫曼树的构造C/C++代码实现
哈夫曼树:所谓哈夫曼(Huffman)树就是最优二叉树,是带权路径长度WPL最小的二叉树。哈夫曼树的构造:根据哈夫曼树的特点:权值越大的结点离根结点越近。具体方法:依次选择权值最小的二个结点作为左右子树构造一颗新的二叉树,其产生的根结点的权值为左右子树权值之和。一直重复直到只含一棵树为止。‘权值:哈夫曼树:哈夫曼树的存储:由于哈夫曼树中没有度为1 的结点,则一棵有n个叶子结点的哈夫曼树共有 2n-1个结点,可以存储在一个大小为2n-1的一维数组中。为了实现方便,数组的0号单元不使用,从原创 2020-06-10 14:09:29 · 12277 阅读 · 3 评论 -
线索二叉树的构造与遍历C/C++代码实现
线索二叉树:线索二叉树分成三种:对二叉树按照不同的遍历次序进行线索化,可以得到不同的线索二叉树,包括先 序线索二叉树、 中序线索二叉树和后序线索二叉树。如果有左孩子则lchild指向左孩子,否则指向前驱,如果有右孩子则rchild指向右孩子,否则指向后继,即:LTag为0:lchild域指向左孩子,为1:指向遍历前驱。RTag为0:rchild域指向右孩子,为1:指向遍历后继。带头结点的二叉树中序线索化:在二叉树的线索链表上也添加一个头结点,并令其 lchild 域的指针指向二叉树的根结点原创 2020-06-09 16:02:16 · 647 阅读 · 0 评论 -
二叉树的遍历及其应用C/C++代码实现
二叉树的存储结构:顺序存储:只适合完全二叉树。链式存储:利用这种结点结构所得二叉树的存储结构分别称之为二叉链表和三叉链表。二叉树的遍历:规定先左后右,按照根结点的访问次序可分为先(根) 序遍历、中(根) 序遍历和后(根) 序遍历。先序遍历序列:ABCDEGF中序遍历序列:CBEGDFA后序遍历序列:CGEFDBA注意:另外由二叉树的先序序列和中序序列,或由其后序序列和中序序列均能唯一地确定一棵二叉树。 但先序序列和后序序列不能唯一确定一棵二叉树。遍历的应用:1,建立二叉链表2,复原创 2020-06-08 14:42:25 · 8187 阅读 · 4 评论 -
串的模式匹配KMP算法C/C++代码实现
KMP算法思想:KMP算法是对BF算法的改进,关键在不需回溯主串的i指针,且根据next数组的值移动子串的j指针。匹配过程中匹配成功, 则i和j分别增1,否则,i不变, 而j退到next[j]的位置再比较,若相等, 则指针各自增1, 否则j再退到下一个next值的置,依次类推,直至下列两种可能:一种是j退到某个next值时字符比较相等,则指针各自增1, 继续进行匹配;另一种是j退到值为零(即模式的第一个字 符 "失配"),则此时需将模式继续向右滑动一个位置next数组:计算next值有两种方法:原创 2020-06-05 19:31:48 · 2897 阅读 · 0 评论 -
串的模式匹配BF算法C/C++代码实现
串:串是一种内容受限的线性表。与线性表基本操作不同的是,串是以“串的整体”作为操作对象的。考虑到存储效率和算法的方便性, 串多采用顺序存储结构。BF算法:算法思想简明,从始位置开始逐一匹配,匹配成功继续下一个,若失败则回溯:主串的指针i总是回溯到 i-j+2 位置,模式串的指针总是恢复到首字符位置 j= 1代码如下:( 为了方便说明问题,算法描述当中所用到的顺序存储的字符串都是从下标为1的数组分量开始存储的, 下标为0的分量闲置不用)#include<stdio.h>#原创 2020-06-05 11:25:13 · 5491 阅读 · 0 评论 -
链队列的基本操作C/C++代码实现
链队列的结构:链队列与单链表相同但与链栈不同的是,链队列需要添加一个头结点,并让头指针始终指向头结点。入队:链队列也不需要判断队满。出队:链队列队空条件:Q.front==Q.rear (与循环队列形式相同)需要特别注意的是:需要判断出队元素是否为最后一个元素,若是,则将队尾指针重新赋值, 指向头结点。 (否则尾指针将丢失)代码如下:#include<stdio.h>#include<stdlib.h>#define MAXQSIZE 100typede原创 2020-06-03 20:47:23 · 5331 阅读 · 2 评论 -
循环队列的基本操作C/C++代码实现
循环队列的结构:在非空队列中,头指针始终指向队列头元素,而尾指针始终指向队列尾元素的下一个位置,阴影部分表示队列:另外通过取模,头指针和尾指针就可以在顺序表空间内以头尾衔接的方式 ”循环" 移动。(为了防止假溢出)注意:循环队列为了方便判断队空和队满,一般少用一个元素空间, 即最后一个元素不用,队列空间大小为m时,有m-1个元素就认为是队满。详情见入队和出队。求队列长度:队列长度为:(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE入队:队满的条件: (Q rear+ 1)原创 2020-06-03 18:27:51 · 4238 阅读 · 0 评论 -
栈与递归之汉诺塔C/C++代码实现
1,汉诺塔游戏规则:将塔座A上的n个圆盘移至塔座C上,并仍按同样顺序叠排,圆盘移动时必须遵循下列规则:(1)每次只能移动一个圆盘;(2)圆盘可以插在A、B和C中的任一塔座上;(3)任何时刻都不能将一个较大的圆盘压在较 小的圆盘之上。问题分析:可以用分治思想来解决这个问题:假如盘数为n,用C柱做过渡,将A柱上的n-1个盘子移到B柱上;再将A上最大的那个盘子移到C上,最后用A柱做过渡,把B上的n-1个盘子移到C上。递归的结束条件是:当n=1时,即只有一个盘子时,只需将编号为1的圆盘从塔座A原创 2020-06-03 15:10:38 · 836 阅读 · 0 评论 -
链栈的基本操作C/C++代码实现
链栈的结构:由于栈的主要操作是在栈顶插入和删除, 显然以链表的头部作为栈顶是最方便的,且不需要附加一个头结点。初始化:栈顶指针S置空即可。入栈:链栈不需要判断栈是否满!出栈:栈顶指针S等于NULL表空栈,即链栈S==NULL时为空栈。代码如下:#include<stdio.h>#include<stdlib.h>#define MAXSIZE 100typedef int SElemType;//链栈的存储结构typedef struct Sta原创 2020-06-03 12:14:45 · 4613 阅读 · 3 评论 -
顺序栈的基本操作C/C++代码实现
顺序栈结构:设顺序栈为S,需要注意的如下:入栈:栈满时 S.top-S.base==S.stacksize出栈:栈空时 S.top == S.base取栈顶元素:++会改变自身值,而-1不会改变,故返回*(S.top-1);顺序栈特点:由于顺序栈和顺序表一样, 受到最大空间容量的限制, 虽然可以在 “满员” 时重新分配空间扩大容量, 但工作量较大,因此在应用程序无法预先估计栈可能达到的最大容量时,应该尽量避免使用顺序栈。代码如下:#include<stdio.h>#原创 2020-06-03 11:40:13 · 27802 阅读 · 9 评论 -
线性表的合并C/C++代码实现
1,无序线性表的合并只要从B中依次取得每个数据元素, 并依值在A中进行查访, 若不存在, 则插入。代码如下:#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAXSIZE 100#define ElemType int#define Status int//顺序表的数据结构typedef struct { ElemType *data; int length;}SqL原创 2020-06-02 10:58:39 · 13651 阅读 · 2 评论 -
单链表头插法和尾插法C/C++代码实现
1,头插法/前插法:通过将新结点逐个插入链表的头部(头结点之后)来创建链表,每次申请一个新结点,读入相应的数据元素值,然后将新结点插入到头结点之后。需要注意的是:头插法是逆序的,先插入的反而在后面。代码如下:#include<stdio.h>#include<stdlib.h>//书的数据结构struct Book{ char title[128]; char author[40]; struct Book *next; //指针域};//头插法添加一原创 2020-05-31 17:22:30 · 2779 阅读 · 0 评论 -
单链表的基本操作C/C++代码实现
插入:删除:线性表的链式存储特点:链表是一种顺序存取结构,按位置访问链表中第i个元素时,只能从表头开始依次向后遍历链表,直到找到第i个位置上的元素,时间复杂度为O(n), 即取值操作的效率低。但在确定插入或删除的位置后,插入或删除操作无需移动数据,只需要修改指针, 时间复杂度为0(1)。基于此,若线性表的主要操作是和元素位置紧密相关的这类取值操作,很少做插入或删除时, 宜采用顺序表作为存储结构。 对于频繁进行插入或删除操作的线性表,宜采用链表作为存储结构。代码如下:注意:删除算法中的循环条件原创 2020-05-31 16:23:40 · 3422 阅读 · 1 评论