数据结构
书上写的很简单,但是一实践就不知所措。期末临近,争取把线性表,树,图这些重要的数据结构和它们的简单操作都实现一遍,一来巩固知识,二来提高自己的编程能力。
h3xz
这个作者很懒,什么都没留下…
展开
-
算法学习:快速排序(java实现)
快速排序(英语:Quicksort),又称分区交换排序(partition-exchange sort),简称快排,一种排序算法,最早由东尼·霍尔提出。在平均状况下,排序n个项目要O(n logn) O(nlog n)(大O符号)次比较。在最坏状况下则需O(n^2)次比较,但这种状况并不常见。事实上,快速排序O(n logn)通常明显比其他算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地达成。-----《维基百科》快速排序使用分治法(Divide and conque.原创 2020-09-16 14:25:04 · 200 阅读 · 0 评论 -
用java将中缀表达式转换成后缀表达式(逆波兰表达式)实现功能简单的计算器
文章目录中缀表达式转成后缀表达式:通过后缀表达式来计算结果:代码实现:将中缀表达式存入LIst:将中缀表达式的List转换成逆波兰表达式的List:完成对逆波兰表达式的计算:定义一个类,可以返回运算符的优先顺序:测试代码:中缀表达式:就是常见的运算表达式:如"3+52","4-(23)+9"后缀表达式(逆波兰表达式):不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则)。 &nb原创 2020-09-07 14:32:37 · 782 阅读 · 0 评论 -
java手动实现LinkedList,并实现删除,插入等基本操作
java中的LinkedList本质上是一条双向链表,因为在学C的数据结构的时候没有实现过双向链表,借此机会来理解java中的LinkedList深层次的实现。这里本人手动实现的LinkedList中没有头节点,如果有需要,可以自己手动添加。目录1. 节点的结构定义2.用尾插法增加一个节点3.改写toString()方法4.返回特定下标的节点5.删除一个节点6.插入一个节点7.取得指定下表的节点的内容手动分割线 ---------------------------------------原创 2020-07-28 12:33:47 · 853 阅读 · 0 评论 -
用java实现ArrayList(顺序存储结构),并实现插入,删除等基本操作
Java中的ArrayList在底层实际上使用数组实现的,它拥有和数组相似的特性,容易存取,不容易插入或者删除。下面来看看如何手动实现一个ArrayLis,实现的ArrayList中增加有泛型。首先创建一个名为hxzArrayList的类,里面有我们待实现的方法:class hxzArrayList<E>{ Object[] elementData;//定义容器中的属性 private int size;//容器中元素的个数 private static final int原创 2020-07-26 23:30:12 · 1153 阅读 · 0 评论 -
C语言创建AVL树,实现插入,查找,遍历等操作,对旋转的详细解释。
目录AVL树:特点:作用预备知识:平衡因子bf(Balance Factor):最小不平衡子树旋转有四中基本类型(LL,RR,LR,RL四种类型):LL型:(可以这样理解:RR型表示失衡节点的右子树过高,因此要通过左旋来降低右子树的高度)RR型:(可以这样理解:RR型表示失衡节点的右子树过高,因此要通过左旋来降低右子树的高度)LR型:RL型:求树的深度(对代码测试有用):中序遍历:最后附上源代码:AVL树:是平衡二叉查找树的一种,平衡二叉原创 2020-06-29 18:14:28 · 1004 阅读 · 0 评论 -
C语言实现二叉排序树,并实现插入与删除操作。
通过学习我们可以知道:顺序表便于搜索,但是不便于插入与删除;而链表便于插入和删除却不便于搜索,那么有没有比较折中的数据结构呢?答案就是:二叉排序树。二叉排序树既有数组的有点也有链表的优点,非常适合处理大批量的动态数据。二叉排序树的定义:若左子树不空,则左子树上所有结点的值均小于它的根结点的值;若右子树不空,则右子树上所有结点的值均大于它的根结点的值;左、右子树也分别为二叉排序树;没有键值相等的结点。二叉排序树的结构定义:typedef struct BiTNode{ int da原创 2020-06-26 00:09:34 · 2100 阅读 · 0 评论 -
C语言实现邻接矩阵转换成边集数组,克鲁斯卡尔(Kruskal)算法,并对其优化
克鲁斯卡尔算法实际上是并查集的一个应用。通过访问边的起点和终点所在的集合是否为同一个来判断该边加入生成树后是否会形成环路。首先要一个创建邻接矩阵:邻接矩阵的结构定义:typedef struct{ char vexs[ MAXSIZE ] ; int arcs[ MAXSIZE ][ MAXSIZE ] ; int VertexNum , EdgeNum ;}MGraph ;查找顶点在顶点表中的下标:int Locate( MGraph G , char ch )原创 2020-06-18 00:36:59 · 2006 阅读 · 2 评论 -
用C语言实现拓扑排序
顶点表示活动、边表示活动间先后关系的有向图称做顶点活动网(Activity On Vertex network),简称AOV网。拓扑排序实现思路:先把入度为0的结点全部压入栈中,遍历入度为0的结点,把遍历过的结点压入栈中,然后删除以该结点为弧尾的弧和删除该结点。...原创 2020-06-17 00:21:36 · 2763 阅读 · 3 评论 -
用C语言创建邻接表,并实现DFS+BFS
邻接表的结构定义:typedef struct EdgeNode //边表节点{ int index ; struct EdgeNode *next ;}EdgeNode ;typedef struct VertexNode //表头结点表结点{ char data ; EdgeNode *firstedge ;}AdjList[ MAXVerTex ] ;typedef struct{ AdjList adjlist ; int vexn原创 2020-06-14 23:49:18 · 917 阅读 · 0 评论 -
用邻接矩阵创建无向图,实现DFS+BFS
由于图的复杂结构,其物理位置与逻辑位置并不匹配,不能用一维数组来存储图。可考虑用一维数组来存储图的结点信息,二维数组来存储节点间的关系,这种存储方式就叫做邻接矩阵。图的结点结构定义:typedef struct{ char vexs[ MVNum ] ;//存储结点信息 int arcs[ MVNum ][ MVNum ] ; //存储权值 int vexnum , arcnum ;//定义图的节点个数和边的条数}AMGraph ;查找结点元素在vexs[]数组中的下标:原创 2020-06-13 23:54:32 · 1442 阅读 · 0 评论 -
用C语言创建二叉树,并实现前中后遍历,计算深度,结点个数等操作。
因为完全二叉树的严格定义,其有非常多的特点和性质,我们创建一般的二叉树时,可将其“填补”成完全二叉树。创建二叉树(前序遍历的方式建立二叉树):void CreateBiTree( BiTree *T ){ char c ; scanf( "%c" , &c ) ; if( c == '#' ) *T = NULL ; else { *T = ( BiTNode * )malloc( sizeof( BiTNode ) )原创 2020-06-10 17:58:51 · 742 阅读 · 0 评论 -
C语言创建链队列,并实现初始化、遍历、插入、删除、销毁等基本操作。
从循环队列的存储结构的特点我们知道:顺序存储必须分配一块连续的内存,不够灵活,并且还要担心数组越界的问题,链式存储就体现出了它的优势。链队列初始化:void InitLinkQueue( LinkQueue *Q ){ int i ; QNode *p ; Q->front = ( QNode * )malloc( sizeof( QNode ) ) ; Q->rear = Q->front ; for( i = 0 ; i < QUE原创 2020-06-09 23:08:20 · 6305 阅读 · 0 评论 -
C语言创建队列循环队列,并实现初始化、遍历、插入、删除、销毁等基本操作。
队列:特殊的线性表,“先进先出”,在尾结点处插入,头节点处删除。它也有有顺序存储和链式存储两种存储结构。为了防止“假溢出”,顺序存储我们用循环队列来实现,为了便于辨别队列是否已满,通常要保证循环队列满的时候,数组仍有一个空闲空间。判断循环队列:队列已满:( rear + 1 ) % MAXIZE = front队列为空:rear = front队列长度:( MAXIZE - front + rear ) % MAXIZE队列的结构定义:typedef int Status ;typedef原创 2020-06-09 22:58:22 · 6508 阅读 · 0 评论 -
用C语言创建单链表并实现插入、删除等简单操作
单链表比起顺序表来说存储更灵活,在需要进行频繁的插入或删除操作的情况下,使用单链表来操作更加简单。但是在需要查找元素,计算链表长度时又会显得比较麻烦。选择顺序表还是单链表是要依情况而定。创建单链表(头插法):头插法:始终让每个新结点放在链表中第一个位置,这样导致的结果是:当我们对链表进行遍历时,先遍历的是最后加入链表的结点。(下面给出的代码先不给新结点的数据域赋值,尾插法也是)void CreateListHead( LinkList *L , int length ){ int i ;原创 2020-06-08 17:49:44 · 5505 阅读 · 1 评论 -
用C语言创建顺序栈并实现出栈、入栈等简单基本操作
栈:是一种特殊的线性存储数据结构,分为顺序栈和链式栈,其特点是“先进后出”,类似于箱子。栈底元素保持不变,对栈中元素的删除(出栈)和插入(压栈)操作只能在栈顶进行操作。栈的结构定义:typedef struct{ int base ;//base始终是指向栈底 int top ; //top指向栈顶元素的上一个位置 int data[ MAXIZE ] ; //定义栈} Stack ;初始化栈:void init_stack( Stack * S ){ S-原创 2020-06-06 15:22:05 · 10727 阅读 · 2 评论