
C语言数据结构学习总结
文章平均质量分 67
澜色海湾
这个作者很懒,什么都没留下…
展开
-
23.0、C语言数据结构——散列表(哈希表)查找
数字分析法通常适合处理关键字尾数比较大的情况,例如我们现在要存储某家公司员工登记表,如果用手机号作为关键字,那么我们发现抽取后面的四位数字作为散列地址是不错的选择;散列技术是在记录的存储位置和他的关键字之间建立一个确定的对应关系 f ,使得每个关键字 key 对应一个存储位置 f ( key );这里的random是随机函数,当关键字的长度不等时,采用这个方法构造散列函数是比较合适的;当查找记录时,我们通过同样的是散列函数计算出的散列地址,并按次散列地址进行访问;- 计算散列地址所需的时间;原创 2022-10-22 16:41:52 · 1459 阅读 · 0 评论 -
22.0、C语言数据结构——二叉排序树
若他的左子树不为空,则左子树上所有结点的值均小于他的根结点的值;- 若他的右子树不为空,则左子树上所有结点的值均大于他的根结点的值;- 他的左、右子树也分别为二叉排序树(可用递归的方式实现)原创 2022-10-20 17:13:22 · 740 阅读 · 0 评论 -
21.0、C语言数据结构——图的遍历(深度、广度优先遍历)
当我们遇到走过的顶点时,就看看其他顶点是否有标记如果都有标记就退回上一个结点,再次检查其他顶点是否都有标记如果没有就往没有标记的顶点走去,如果都有标记就再退回到上一个顶点,最后退回到初识顶点 A 的时候遍历结束;但是谈到图的遍历,那就是复杂多了,因为他的任意顶点都是可以和其余的所有顶点相连接的,因此极有可能存在重复走过某个顶点或者漏掉某个顶点的遍历过程;树的遍历我们谈了四种方式,大家回忆一下,树因为根结点只有一个,并且所有的结点都只有一个双亲,所以不是很难理解;代码实现其实就是一个递归的过程;原创 2022-10-17 15:29:29 · 1505 阅读 · 0 评论 -
20.0、C语言数据结构——图的存储结构
考虑到图是由顶点和边或弧两部分组成的,合在一起比较困难,那就很自然的考虑到分为两个结构来分别存储; 顶点因为不区分大小,主次,所以用一个一维数组来存储是很不错的选择; 而边或弧由于是顶点与顶点之间的关系,一维数组肯定就搞不定了,那我们不妨考虑一个二维数组来存储; 图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图;一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息; 我们可以设置两个数组,顶点数组原创 2022-10-17 12:29:16 · 546 阅读 · 0 评论 -
19.0、C语言数据结构——图 ( 2 )
所谓的一个连通图的生成树是一个极小的连通图,它含有图中全部的 n 个顶点,但只有足以构成一棵树的 n - 1 条边;原创 2022-10-16 17:03:11 · 687 阅读 · 0 评论 -
18.0、C语言数据结构——图 ( 1 )
线性表中我们把数据元素叫元素,树种叫结点,在图中数据元素我们则称为顶点(Vertex)- 线性表可以没有数据元素,称为空表,树种可以没有结点,叫做空树,而图结构在国内大部分的教材中强调顶点集合 V 要有穷非空;- 线性表中,相邻的元素之间具有线性关系,树结构中,相邻两层的结点具有层次关系,而图结构中,任意两个顶点之间都可能有关系,顶点之间的逻辑关系用边来表示,边集可以是空;若顶点 Vi 到 Vj 之间的边没有方向,则称这条边为无向边(Edge),用无序偶(Vi,Vj)来表示;原创 2022-10-16 16:10:53 · 478 阅读 · 0 评论 -
17.0、C语言数据结构——浅析赫夫曼树
谈到数据亚索,就不能不提赫夫曼(Huffman)编码,赫夫曼编码是首页实用的压缩编码方案,即使在今天的许多知名压缩算法里,依然可以见到赫夫曼编码的影子;在剩下的森林中选出一棵权值最小的结点,如果比刚刚生成的新结点权值小就放左边,反之放右边,该结点与新结点又生成一个新结点,结点权值为左右孩子之和;在森林中选出两棵根结点的权值最小的二叉树,合并两棵选出的二叉树,增加一个新结点作为新二叉树的根,权值为左右孩子的权值之和;- 前缀码:所谓的前缀码,就是没有任何码字是其他码字的前缀;原创 2022-10-16 14:43:24 · 990 阅读 · 0 评论 -
16.0、C语言数据结构——树、森林、二叉树
第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树的根结点,将各二叉树的根结点视为兄弟从左至右连在一起,就形成了一棵二叉树;我们惊人的发现:树、森林的前根(序)遍历和二叉树的前序遍历结果相同,树、森林的后根(序)遍历和二叉树的中序遍历的结果相同;- 去线,在树种每个结点,只保留他与第一孩子结点的连线,删除他与其他孩子结点之间的连线;若结点 x 是其双亲 y 的左孩子,则把 x 的右孩子,右孩子的右孩子,......都与y用线连起来;先依次遍历每棵子树,然后在访问根结点;原创 2022-10-15 17:50:28 · 453 阅读 · 0 评论 -
15.0、C语言数据结构——二叉树
对一棵具有 n 个结点的二叉树按层序编号,如果编号为 i ( 1原创 2022-10-14 17:30:22 · 759 阅读 · 0 评论 -
14.0、C语言数据结构——树 (2)
这样的存储结构,我们可以根据某结点的 parent 指针找到他的双亲结点,所用的时间复杂度是O(1),索引到parent的值为-1时,表示找到了树结点的根;我们假设以一组连续空间存储树的结点,同时在每个结点中,附设一个指示其双亲结点在数组中的位置的元素;这样我们就克服了浪费这个缺点,但是每个结点的度的值不同,初始化和维护起来难度巨大,还是不可取;存储结构的设计是一个非常灵活的过程,只要你愿意,你可以设计出任何你想要的奇葩存储结构~缺点十分明显,就是造成了浪费;原创 2022-10-13 16:37:35 · 277 阅读 · 0 评论 -
13.0、C语言数据结构——树 (1)
树(Tree )是n (n>=0)个结点的有限集。1. 有且仅有一个特定的称为 根(Root)的结点;2. 当 n>1 时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、......、 Tm ,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree);- n > 0时,根结点是唯一的,坚决不可能存在多个根结点;- m > 0时,子树的个数是没有限制的,但他们互相是一定不会相交的;结点拥有的子树数称为结点的度 - (Degree),树的度取决于数内各结点的度的最大值;原创 2022-10-13 15:40:25 · 287 阅读 · 0 评论 -
12.0、C语言数据结构——队列
我们将队头指针指向链队列的头结点,而队尾指针指向终端结点;- 此前我们用浏览器的历史记录作为栈的例子让大家了解了应用广泛,队列在现实中也是按照队列的形式输入和输出的,不然的话就很容易闹出问题;创建一个队列要完成两个任务:一是在内存中创建一个头结点,而是将队列的头指针和尾指针都指向这个生成的头结点,因为此时是空队列;出队列操作是将队列中的第一个元素移除,队头指针不发生改变,改变头结点的next指针即可;- 与栈相同的是,队列也是一种重要的线性结构,实现一个队列同样需要顺序表或链表作为基础。原创 2022-10-08 14:18:09 · 215 阅读 · 0 评论 -
11.0、C语言数据结构——栈
栈是一种重要的线性结构,可以这样讲,栈是前面讲过的线性表的一种具体形式;原创 2022-10-06 15:30:32 · 794 阅读 · 0 评论 -
1.0、C语言数据结构——单链表尾插法练习
【代码】1.0、C语言数据结构——单链表尾插法练习。原创 2022-10-01 16:58:01 · 332 阅读 · 0 评论 -
10.0、C语言数据结构——循环链表
其实循环链表的单链表的主要差异就在于循环的判断空链表的条件上,原来判断 head -> next 是否为 null ,现在则是 head -> next 是否等于head;对于单链表,由于每个结点只存储了向后的指针,到了尾部表示就停止了像后链的操作;3. 将链表中终端结点的指针由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表成为单循环链表,简称循环链表;2. 事实上要解决这个问题也并不麻烦,只需要将单链表中终端结点的指针由空指针改为指向头结点,问题就解决了;原创 2022-09-21 16:45:09 · 337 阅读 · 0 评论 -
9.0、C语言数据结构——静态链表
数组的最后一个元素,即下标为 MAXSIZE - 1 的 cur 则存放第一个有数组的元素的下标,相当于单链表中的头结点作用;我们前面说过,在动态链表中,结点的申请和释放分别借用C语言的 malloc() 和 free() 两个函数来实现动态的开辟空间;在静态链表中,操作的是数组,不存在像动态链表的结点申请和释放的问题,所以我们需要自己实现这两个函数,才可以做到插入和删除;- 数组的第一个元素,即下标为 0 的那个元素的 cur 就存放备用链表的第一个结点下标;原创 2022-09-20 21:34:45 · 319 阅读 · 0 评论 -
8.0、C语言数据结构——线性表 (4)
2. 比如在数据 ai-1 后面插入一个ai 那么未插入前 r 指向 ai-1 ,当 ai 插入后将 变量 p 指向 ai,最后让 r 指向 p 然后将 r 指向 ai (因为此时 ai 是末尾元素);3. 再插入 ai + 1 同理此时 r 一定是指向 ai 的,然后将变量 p 指向 ai + 1,最后将 r 指向 p 然后将 r 指向 ai + 1(因为此时 ai + 1 是末尾元素);1. 创建单链表的过程是一个动态生成链表的过程,从空表的初始状态起,依次创建各元素结点并逐个插入链表;原创 2022-09-19 21:31:03 · 320 阅读 · 0 评论 -
7.0、C语言数据结构——线性表 (3)
1.声明一结点 p 指向链表头结点,初始化 j 从 1 开始;2. 当 j < 1 时,就遍历链表,让 p 的指针向后移动,不断指向下一结点,j 累加 1;3. 若到链表末尾 p 为空,则说明第 i 个元素不存在;4. 否则查找成功,在系统中生成一个空结点 s;5. 将数据元素 e 赋值给 s -> data;6. 单链表的插入刚才两个标准语句;7. 返回成功;int j;p = *L;j = 1;}if(!}return OK。原创 2022-09-18 21:49:48 · 212 阅读 · 0 评论 -
6.0、C语言数据结构——链式存储结构 (1)
1. 线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,这组存储单元恶意存在内存中未被占用的任意位置;2. 比起顺序存储结构每个数据元素只需要存储一个位置就可以了;现在链式存储结构中,除了要存储数据元素信息外,还要存储他的后继元素的存储地址(指针);3. 也就是说除了存储其本身的信息外,还需要存储一个指示其直接后继的存储位置的信息;1. 我们把存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域;指针域中存储的信息称为指针或链;原创 2022-09-17 00:07:16 · 904 阅读 · 0 评论 -
5.0、C语言数据结构——线性表 ( 2 )
1. 存储空间的起始位置,数组data,它的存储位置就是线性表存储空间的存储位置;2. 线性表的最大存储容量:数组的长度MaxSize;3. 线性表的当前长度:length;原创 2022-09-15 20:29:19 · 444 阅读 · 0 评论 -
4.0、C语言数据结构——线性表 (1)
若将线性表记为(a1,...,ai-1,ai,ai+1,...an),则表中ai-1领先于 ai,ai 领先于 ai + 1,称 ai - 1 是 ai 的直接前驱元素,ai+1 是 ai 的直接后继元素;所以线性表元素的个数 n(n>=0) 定义为线性表的长度,当 n = 0 时,称为空表;原创 2022-09-13 21:16:18 · 236 阅读 · 0 评论 -
3.0、C语言数据结构——时间复杂度和空间复杂度(2)
1.用常数 1 取代运行时间中的所有加法常数2.在修改后的运行次数函数中,只保留最高阶项3.如果最高阶存在且不是 1 的常数,则去除这个项相乘的常数。原创 2022-09-11 21:24:08 · 847 阅读 · 0 评论 -
2.0、C语言数据结构——时间复杂度和空间复杂度 (1)
1、算法采用的策略,方案2、编译产生的代码质量3、问题的输入规模4、机器执行指令的速度由此可见,抛开这些与计算机硬件、软件有关的因素,一个程序的运行时间依赖于算法的好坏和问题的输入规模。(所谓的问题输入规模是指输入量的多少)原创 2022-09-10 21:29:05 · 314 阅读 · 0 评论 -
1.0、C语言数据结构 ——初识数据结构和算法
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作从刚才的例子中我们也可以看到,对于给定的问题,是可以有多种算法来解决的;一个问题可以有多个算法解决,一个算法也不可能具有通解所有问题的能力;原创 2022-09-10 20:35:09 · 321 阅读 · 0 评论