
数据结构学习代码
记录在学习数据结构中实现的部分代码
守护荆棘
希望能见证自己从弱到强
展开
-
普里姆算法Prim实现最小生成树
再次推荐B站视频青岛大学王卓老师的数据结构,讲的非常通俗易懂。结合了“大话数据结构”用C++实现了相关代码;#include<iostream>#include<vector>using namespace std;struct Graph { vector<vector<int>> arc; vector<char> vexs; int numVexter; int numEdge; Graph(){} Graph(i原创 2020-08-26 17:00:58 · 355 阅读 · 0 评论 -
图的创建和遍历
第一轮在学习数据结构时有意避开了图章节,自我暗示面试不会问。躲还是躲不掉的,学还是要学的。“大话数据结构”结合B站视频学习了一遍。自己将图的邻接矩阵表示方法和邻接表的表示方式以及图的遍历写了一遍,加深印象。无向图邻接矩阵表示:#include<iostream>#include<vector>using namespace std;struct Graph { vector<char> vexs; vector<vector<int>原创 2020-08-25 16:47:23 · 334 阅读 · 0 评论 -
哈夫曼树与哈夫曼编码和解码实现
今天在复习哈夫曼树的时候,发现了一个不错的B站视频,讲解的非常清晰直观。地址传送门。有讲到了哈夫曼树的原理及哈夫曼编码解码的过程。原理讲解直接移步上述链接,就不再画蛇添足。作为巩固随手练习一道题:给定一篇文章,统计里面的各个字符出现的频次,并构建哈夫曼树,实现哈夫曼编码和解码的过程。并且计算哈夫曼编码和定长编码的空间节省了多少?输入的文本:each year, the american heart association (aha), in conjunction with the centers f原创 2020-08-24 21:34:42 · 1649 阅读 · 2 评论 -
平衡二叉树构建及递归和非递归遍历树实现(c++)
最近面试被问到平衡二叉树的性质及手撕构建平衡二叉树。当时无从下手,翻看牛客网面经,发现是一个常考点。虽然代码量相对较多,但确实是必须要掌握的知识。记录如下:性质:1、平衡二叉树其左右子树都为平衡二叉树,且树的深度的绝对值不会超过1;2、将平衡因子(BF)定义为,其左子树的深度减去右子树的深度,则只会有-1,0,1三种情况;3、平衡二叉树属于二叉搜索树(BST),也满足二叉搜索树的一些性质:左子树和右子树都是二叉搜索树。左子树所有节点值都小于等于其根节点值,右子树所有节点的值都大于等于其根节点的值;原创 2020-07-10 14:21:47 · 598 阅读 · 0 评论 -
排序之希尔排序(C++)
希尔排序是在插入排序的基础上改进得来。因为插入排序对于基本有序和小序列有较快的速度。但是对于大序列和无序的序列就有缺陷。因此希尔排序的思想就是将序列转化为若干小序列,每个小序列使用插入排序,最终实现基本有序,最后微调即可进一步优化排序方法。将前面所讲的排序时间复杂度从O(n2)降到O(n1.3),代码如下:Input number (q to quite): 9 5 6 1 3 4 6 5 9 7 1 3 6 4 9 qYour input List is: 9 5 6 1 3 4 6 5 9 7 1原创 2020-05-12 21:42:08 · 186 阅读 · 0 评论 -
排序之直接插入排序(C++)
直接排序就是将未排序部分的元素插入到已排序的元素列表中,代码实现:Input number (q to quite): 9 6 4 1 3 9 4 6 8 7 3 1 6 4 5 9 4 qYour input List is: 9 6 4 1 3 9 4 6 8 7 3 1 6 4 5 9 4After sort: 1 1 3 3 4 4 4 4 5 6 6 6 7 8 9 9 9#include<iostream>using namespace std;#define MA原创 2020-05-12 19:03:21 · 273 阅读 · 0 评论 -
排序之选择排序(C++)
选择排序是找到最小的之后在进行交换,相较于冒泡排序可以减少交换的次数。其代码实现如下:Input number (q to quite): 9 6 4 1 3 8 4 6 9 7 2 3 6 qYour input List is: 9 6 4 1 3 8 4 6 9 7 2 3 6After bubble sort: 1 2 3 3 4 4 6 6 6 7 8 9 9#include<iostream>using namespace std;#define MAXSIZE 1原创 2020-05-12 18:30:42 · 240 阅读 · 0 评论 -
排序之冒泡排序(C++)
终于到了“大话数据结构”最后一个章节了。当然前面的图和树还有待大量的学习和训练。冒泡排序,应该是最简单的排序方式了,以下为其基本和改进实现:Input number (q to quite): 5 3 1 9 4 6 3 7 9 1 6 4 3 4 qYour input List is: 5 3 1 9 4 6 3 7 9 1 6 4 3 4After bubble sort: 1 1 3 3 3 4 4 4 5 6 6 7 9 9#include<iostream>using原创 2020-05-12 18:11:41 · 288 阅读 · 0 评论 -
Hash表的建立,插入与查找实现(C++)
本文实现了一个基本的HASH表的构建插入和查找过程。主要函数功能如下:bool InitHashTable(HashTable &H); //hash表的初始化int Hash(const int key); //哈希函数,计算地址bool InsertHash(HashTable &H, const int key); //插入新元素bool SearchHash(HashTable &H, const int key, int &add); //删原创 2020-05-10 22:16:51 · 1690 阅读 · 1 评论 -
二叉排序树查找,插入和删除实现(C++)
本文介绍了二叉排序树查找,插入和删除C++实现过程。代码如下:#include<iostream>using namespace std;typedef int TypeName;struct Node{ TypeName data; Node *lchild, *rchild;};typedef Node* Tree;void Creat_Tree(Tree &T);bool SearchTree(Tree T, int key, Tree f, Tre原创 2020-05-09 18:57:27 · 539 阅读 · 0 评论 -
顺序查找,折半查找和斐波那契查找实现(C++)
代码实现了四种方法对顺序表进行顺序查找和折半查找。1、主要函数功能介绍:// 顺序查找方法一:for循环遍历int Binary_Search(int *arr, const int n, const int key);// 顺序查找方法二: 设置“哨兵”位,优化边界判断比较int Sequential_Search(int *arr, const int n, const int ke...原创 2020-05-07 14:35:20 · 781 阅读 · 1 评论 -
二叉树的建立与前序、中序和后序遍历(C++)
这两天停更了博客,在停下来学习树。不得不说相比较于链表、栈和队列等,树有更复杂的结构和特性。当然基本思想也离不开前面学的基本结构。比较困难的点就在于如何优雅的实现二叉树的建立和遍历–递归思想。对于刚接触递归的我来说,还是需要多想多练。本例结合“大话数据结构”中的例题,构建二叉树和用三种方法,实现对树的遍历。我们想创建一个前序为“AB#D##C##”的二叉树,将树中的每个空指针引出一个虚节点,用#...原创 2020-04-30 13:53:44 · 474 阅读 · 0 评论 -
串的基本功能实现(C++)
串第一次听说,实际上就和C++封装好的string对象类似。本例题中,利用C++自实现了string类的一些功能函数,一方面回顾c++的一些知识,另一方面也加深对string对象的了解。编程过程中,为了省事,也或多或少利用了string的函数,例如size(),clear()等。主要函数功能介绍:Stringv1() { length = 0; } //构造函数Stringv1(cons...原创 2020-04-27 17:05:02 · 741 阅读 · 0 评论 -
队列的链式存储结构基本实现(C++)
前面我们实现了队列的顺序存储结构的一般功能。并用循环列表使取第一个元素的时间复杂度从O(n)降到了O(1)。一般来说,当我们已知队列的最大可能长度时,用顺序存储结构实现,因为可以减少链式存储结构中寻址时间开销。但当我们不知道具体长度时,为了避免内存的浪费或者内存不够的情况,一般我们选择链式存储结构。主要函数介绍:本例实现中,利用了结构体存储节点信息。并利用了函数模板实现了队列链式存储结构的实例...原创 2020-04-26 20:18:30 · 494 阅读 · 0 评论 -
循环队列的顺序存储结构基本实现(C++)
队列的顺序存储结构和链表的顺序存储结构非常的相近。为了降低队列的输出时间复杂度,将队列设置为循环队列,基本原理“大话数据结构”讲的很清楚,这里列出接个关键点:1、判断队列为空的条件 front==rear //其中front为指向头元素的下标,rear为指向尾元素的下标的下一位置2、判断队列为满的条件 (rear+1)%MAXSIZE //其中MAXSIZE为允许队列的最大长度 ...原创 2020-04-26 17:12:00 · 510 阅读 · 0 评论 -
栈的应用举例(C++)
昨天学习了数据结构栈,并实现了栈的顺序存储结构和链式存储结构。今天就实现“大话数据结构”中对栈的应用举例。原理省略,书比我讲得好,直接上代码吧。应用1:斐波那契数列实现输出斐波那契数列前10个元素,比较简单就不再赘述。#include<iostream>using namespace std;int Fbl(int i){ if (i < 2) return...原创 2020-04-26 14:36:25 · 466 阅读 · 0 评论 -
栈的链式存储结构基本功能实现(C++)
代码写多还是会愈发的顺手。写这个示例时,主要的问题在于实现时节点和链表的表示指针有点混乱,不能够马上的反映出来。革命尚未成功,同志仍需努力啊!写完之前的代码,停下来看了下别人前面内容的实现过程,对比发现结构还是比较混乱的。本例中将节点用结构体表示,包含两个数据成员,分别是数据域和指针域。然后将栈定义为一个模板类,包含两个私有成员,分别是栈的头指针和栈中元素的个数。将栈的基本功能函数声明在类公有成...原创 2020-04-25 22:23:52 · 461 阅读 · 0 评论 -
两个顺序栈共享空间基本实现(C++)
这一个示例就是在顺序栈的基础上加上了一些条件判断,使得两个相同数据类型的栈能够共用一个空间。节省内存的消耗。试验代码和函数功能如下:template<typename T>class sqStack {private: T data[MAXSIZE]; int top1; int top2;public: sqStack(); //默认构造函数; T GetTo...原创 2020-04-25 19:49:23 · 1023 阅读 · 0 评论 -
栈的顺序存储结构基本实现(C++)
写这段代码就感觉舒服很多,很快完成,可能本身就比较简单吧。使用了一个模板类来实现栈的顺序存储结构的实例化,代码及函数功能如下:template<typename T>class sqStack {private: T data[MAXSIZE]; int top; //top指向栈的栈顶元素而不是栈顶的下一个元素public: sqStack(); /...原创 2020-04-25 18:59:03 · 362 阅读 · 0 评论 -
静态链表的基本实现过程(C++)
自我感觉静态链表的实现过程比动态链表困难了不少,需要考虑更多的参数和更多的边界条件。还需要不断加强训练,写代码的过程比较混乱,而且不能够完全不看书。戒骄戒躁,继续加油。静态链表与链表的顺序存储结构一样,也是将数据存储在数组中。本例题中,数组的每个元素都是一个string对象。代码及函数功能如下:struct Node //定义的每个节点的内容{ string data; int c...原创 2020-04-25 15:02:48 · 280 阅读 · 0 评论 -
线性表的链式存储结构基本实现(C++)
原理一看都懂,代码一看就会,自己一写就错。花了将近3个小时才完成这个代码。有时候真的会自我怀疑,希望坚持下去的结果能让自己满意。线性表的链式存储结构基本实现,先上代码(如下功能函数):这次我将链表中的数据定义为一个class对象,其中包含了书的名字,价格和折扣情况。bool GetElem(const LinkList &L, int i, Book &out) //获得链表...原创 2020-04-24 22:59:02 · 737 阅读 · 0 评论 -
线性链表的顺序存储结构基本实现(C++)
又有一段时间没有更新博客了。在家久了变的异常敏感,什么都会去想,想多了又会自闭。不管咋样,生活还在继续,无法逃避。该面对的还是要直面,就希望安稳毕业,顺利入职。开始数据结构与c++的混合训练模式。看别人的代码写代码,好像啥都懂。拿开自己写,好像啥都不知道。先从最基本的线性链表的顺序存储结构学起吧。先上代码(包含如下函数功能)://使用数组存储数据,建立了LinearList类,并用类模板实现...原创 2020-04-24 19:29:04 · 321 阅读 · 0 评论