![](https://img-blog.csdnimg.cn/2019091217430493.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
严蔚敏数据结构实现
根据高一凡老师的数据结构算法实现一书,结合自己理解和上机实验,总结出在实现具体的数据结构时所遇到的种种问题。
AdvancedPawn
这个作者很懒,什么都没留下…
展开
-
串的定长顺序分配实现
注意事项:串是由零个或多个字符组成的有限序列。零个字符的串成为空串。串中任意个字符组成的子序列成为该串的子串。包含子串的串成为主串。通常称字符在序列中的序号为该字符在串中的位置。只有当两个串的长度和各个对应位置的字符都相等时,两串才相等。串的逻辑结构和线性表相似,但基本操作不同。串多以整体为操作对象,如查找子串、求取子串、在某个位置插入子串及删除。串的存储方法有:定长顺序存储、堆分配存储...原创 2019-09-12 17:38:37 · 410 阅读 · 0 评论 -
哈夫曼树实现
注意事项:哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的 路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的带权路径长度记为WPL = (W1*L1 + W2 * L2 + W3 * L3 + … + Wn * Ln),N个权值Wi(i = 1, 2, …n)构成一棵有N个叶结点的二叉树,相应的叶结...原创 2019-09-12 17:36:58 · 261 阅读 · 0 评论 -
树和森林实现
注意事项:树的表示方法分为:双亲表示法、孩子表示法、孩子兄弟表示法(二叉链表表示法),目前只涉及二叉链表(孩子兄弟)表示法的森林表示法。由于森林的二叉链表不知道孩子的数量,所以不能使用递归建立,而使用队列辅助建立。#include<stdio.h>#include<string.h>#include<malloc.h>#include<st...原创 2019-09-12 17:33:08 · 526 阅读 · 1 评论 -
线索二叉树实现
注意事项:二叉链表被线索化之后可以不需要使用栈来遍历链表,当先序遍历时没有左结点就访问右结点所指的后继。若在某程序中所用二叉树需经常遍历或查找结点在遍历所得线性序列中的前驱和后继,则应采用线索链表作为存储结构普通二叉链表不需要头结点,而线索二叉树需要,为了第一个结点指针有找落点,如果第一个指针和最后一个都指向头结点,即二叉树为空。由于线索二叉树是在遍历的过程中得到的,所以不同的遍历方法有...原创 2019-09-12 17:32:02 · 166 阅读 · 0 评论 -
非递归遍历二叉树实现
注意事项:先序非递归算法的思想:1.二叉树指针不为空时,根指针入栈,指针指向左孩子,并将根结点输出。如果二叉树指针为空,根指针出栈,指针指向右孩子。(每一次出栈后指针指向其右孩子,可以保证每一个左右结点都可以遍历到)后序遍历非递归算法:从根结点开始,将所有最左结点全部压栈,每当一个结点出栈时,都先扫描该结点的右子树,只有当一个结点的左孩子和右孩子结点均被访问过了,才能访问结点自身。后序遍历...原创 2019-09-12 17:30:15 · 1233 阅读 · 1 评论 -
二叉链表实现
注意事项:使用abcd###e##c#f## 来进行先序输入。或者最后两个为空格,否则会一直提示输入。重点关注层序遍历,因为其特性,所以需要一个队列数据结构来进行配合。结点拥有的子树数为结点的度,度为0的结点为叶子结点,树的度是树内各结点度的最大值,二叉树即度为二的树。树中结点的最大层次称为树的深度。出现半小时BUG:在创建函数定义中使用%d期待输入数字,但实际操作中输入了字母,会导致编...原创 2019-09-12 17:27:32 · 1436 阅读 · 2 评论 -
循环队列实现
注意事项:循环队列,是队列的顺序表示和实现。因为是尾进头出,所以和顺序栈不同的是需要将顺序队列臆造成一个环状的空间,以便在尾部添加满之后从头部空位开始插入。也可以使用数组队列,也就是不能动态增长的顺序队列,这样不需要每次取模最大值来构成环形空间。每次插入新的队列尾元素时,尾指针增1,每当删除队列头元素时,头指针增1。尾指针会出现在头指针之前,由此特性,循环队列在无法预估使用大小时,不宜使用...原创 2019-09-12 17:24:14 · 192 阅读 · 0 评论 -
链队列实现
注意事项:链队列需要设立一个结点结构体(指针域和数据域,与链表结点一样)和一个包含指向这个结构体的首和尾指针的结构体(因为需要一次传递两个参数,这个结构可以使得只需要传递一个参数)。但是先进先出=尾插头删与c++程序不同的是,c语言没有形参的&运算符,可以将在函数中改变的数值返回到变量中,所以只能定义指向链队列指针结构的指针。bug:注意结点结构体的自定义类型,这里出现了一个一小时...原创 2019-09-12 17:23:02 · 230 阅读 · 0 评论 -
顺序栈和链栈实现
注意事项:顺序栈:实现需要使用数组,数组的元素在内存中的存储位置是连续的;且需要知道数组的长度才可以使用;无法避免溢出问题;当系统给数组分配了内存空间,其他的任务是不能使用这个内存空间的;本算法中的顺序栈避免了溢出问题以及空间不能增长的缺陷,使用了动态分配的方法使用连续内存。存储密度 = 1;顺序栈的top指针指向的是栈顶的空元素处,top - 1才是指向栈顶元素;不易实现插入和删除...原创 2019-09-12 17:21:28 · 510 阅读 · 0 评论 -
双向链表实现
注意事项:双向链表的头结点的prior指向最后的结点。最后一个结点的next指向头结点在初始化链表时,前驱后继指针均指向头结点。双向链表是循环链表的一个扩充。但是使用的是头结点。#include<stdio.h>#include<stdlib.h>typedef struct DuLNode{ int data; struct DuLNode *pri...原创 2019-09-12 17:16:57 · 181 阅读 · 0 评论 -
循环链表实现
注意事项:循环链表设置尾指针。由于在链表的操作过程中,尾指针会不断变化,所以在一些函数的形参中都设置指向头指针的指针。以及链表的结束判断条件变成q是否等于尾指针。注意传递的实参需要取地址循环链表的优势在于双链表合并,以及实现尾插法简单(首先新建结点指向头结点,然后把尾指针的next域指向该新建结点)在创建链表时,使用尾插法,而不是用头插法(因为头插法很难去更新尾指针,使得最后尾指针还需额...原创 2019-09-12 17:15:41 · 765 阅读 · 0 评论 -
静态链表实现
注意事项:这里用k申请空间,i遍历空间。静态链表是利用游标来模拟指针,把固定分配的内存分成备用链表和链表两大块,在利用自制的malloc和free函数申请释放备用空间时,实现离散存储。基本操作和动态链表实际上差不多,不过一个是利用p = p->next一个是使用i = L[i].cur来实现指针的后移。初始化链表时,链表只有最后一个空间的cur是0, 意味是头指针,并没有任何分配的...原创 2019-09-12 17:14:24 · 297 阅读 · 0 评论 -
单链表实现
使用头结点的好处:插入删除等函数不需要额外考虑位于首结点的条件。一些改变链表的函数在传参时,如不改变头结点,可只传递普通头结点的指针,否则的话,需要传递首结点指针的指针来应对更改首结点地址的情况。#include<stdio.h>#include<stdlib.h>typedef struct Node//结点的存储结构{ int data; // s...原创 2019-09-12 17:11:49 · 147 阅读 · 0 评论 -
串的堆分配实现
注意事项:在串的顺序存取中,一旦操作的串序列长度超过上界时,会采用截尾法处理,克服这个弊端可以使用动态分配串值得存储空间。堆分配——也是以一组地址连续的存储单元存放串值字符序列,但他们的存储空间是在程序运行过程中动态分配而得。一般对串操作时,多使用堆分配存储方式。#include<stdio.h>#include<string.h>#include<m...原创 2019-09-12 17:39:50 · 701 阅读 · 0 评论