C++数据结构
文章平均质量分 78
主要以C语言实现,C++辅助
Mango酱
这个作者很懒,什么都没留下…
展开
-
数据结构之循环队列详解
队列分为顺序队列和循环队列,顺序队列的实现有很多种方法,有数组和链表。数组实现的又分为使用队头队尾front,rear实现和利用一个变量size统计队列元素大小实现等等。并且关于size实现的顺序队列(数组和链表都实现过)我之前的数据结构文章已经实现过。顺序队列我们可以使用排队买车票进行理解。在讲循环队列之前,我们先讲一下顺序队列的假溢出。1 顺序队列的假溢出1️⃣:初始化空队列,q -> front = q -> rear = 0。2️⃣:入队a1、a2、a3,q -> fr原创 2021-04-11 20:54:28 · 3671 阅读 · 0 评论 -
两个有序链表的合并
两个有序链表的合并前提:1)函数参数的说明:参1为指向一级指针地址的二级指针;参2和参3均是已经排好序的链表。2)参1传参时: struct Node *buf = (struct Node *)malloc(sizeof(struct Node)); Merge(&buf, head1, head2);3)节点类型为:struct Node{ int data; struct Node* next;};1 代码int Merge(struct Node **buf,原创 2020-07-23 15:04:09 · 102 阅读 · 0 评论 -
链表的基本操作(增删改查)
链表的基本操作(增删改查)前提:节点的类型:typedef struct Node { int id; struct Node* next;}SNode;目录:1链表的创建;2 链表的插入;3 链表的删除;4 改,查;5 链表的排序;6 链表的翻转;7 链表的打印;1 链表的创建//创建链表SNode *CreateList() { SNode *head = NULL; head = (SNode*)malloc(sizeof(SNode)); head-&g原创 2020-07-22 23:17:43 · 2055 阅读 · 0 评论 -
数据结构之哈夫曼树
数据结构之哈夫曼树先给出相关基本概念:路径:从树中一个结点到另一个结点之间的路径。路径长度:路径上分支的条数成为路径长度。树的路径长度:从树根到每个结点的路径长度之和称为树的路径长度。结点的权:给树中结点赋予一个数值,该数值称为结点的权。带权路径长度:结点到树根间的路径长度与结点权的乘积,称为该结点的带权路径长度。树的带权路径长度:树中所有叶子结点的带权路径长度之和,记为WPL。最...原创 2020-04-01 11:32:40 · 2327 阅读 · 0 评论 -
数据结构之哈希表
数据结构之哈希表哈希表定义:也叫散列表。根据设定的哈希函数及处理冲突的方法,将元素存储在一段有限的连续空间中。即存储地址H(key)与关键字key的关系构建。常用设置哈希表的方法:1 直接定址法:利用线性函数来设置。H(key)=a*key+b;其中a≠0,b为常数。举例:统计各年龄段的人口,用直接定址法设定哈希函数。2 数字分析法:若关键字是x进制数,且可预知可能出现的所有关键字值,...原创 2020-03-31 11:28:31 · 1016 阅读 · 0 评论 -
数据结构之平衡二叉树
数据结构之平衡二叉树1 树:由n(n>=0)个有限个节点组成的集合,该集合可以是空树或者由一个根节点及其互不相交的左右子树组成。根无前驱,有多个后继。2 二叉树:在树的基础上,限定其后继最多为2个。二叉树的一些性质:性质1:二叉树的第i层上最多有2^(i-1)个结点(i>0)。性质2:深度为k的二叉树最多具有2^k-1个结点。(k>0)性质3:对于任意一棵二叉树...原创 2020-03-30 18:44:23 · 1729 阅读 · 0 评论 -
常见排序算法04之堆排序
常见排序算法04之堆排序1 堆heap:何为堆,堆需要满足两个条件。1)元素插入按照完全二叉树插入。2)父节点值parent要大于左右子节点的值。—大顶堆所以例如有一数组:arr[]={4,10,3,5,1};先按照完全二叉树将元素插入树中。1能插入作为3的左或右节点吗?不能,若这样插入就不是完全二叉树的概念,即不满足从上往下,从左往右。好了数组已经满足了堆的第一个条件,但是...原创 2020-04-02 20:21:32 · 126 阅读 · 0 评论 -
常见排序算法03之快速排序与归并排序
常见排序算法031 快速排序2 归并排序1 快速排序快排注意一下:有些数组第一次是不需要挖坑填坑的。例如,2 5 3 6 4 7。2是基数,从右往左却没有比它小的数,2仍填进原来的位置,此轮填坑就结束,然后递归排序2左右两边的数。看代码:#include<stdlib.h>#include<string.h>#include<time.h>...原创 2020-04-02 13:36:42 · 237 阅读 · 0 评论 -
常见排序算法02之插入排序与希尔排序
常见排序算法021 插入排序2 希尔排序1 插入排序不废话,直接上例子代码。看下列步骤:总结:下面给出两种插入排序的代码:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<time.h>#define MAX_SIZE 10//插入...原创 2020-04-01 19:55:28 · 172 阅读 · 0 评论 -
常见排序算法01之冒泡排序与选择排序
常见排序算法011 冒泡法以8,16,1,5为例。假设从小到大,冒泡法是相邻两数比较的,那么我们8和16比,8小所以不换,然后16与1比,16大要换,即变成了8,1,16,5;然后16和5比,16大要换,变成8,1,5,16。可以看出这是我们第一次相邻两两比较的结果,并不能完全排好序,所以我们需要进行多次比较,多少次呢?可以看出,一轮确定一个最大数,所以我们n轮就可以确定n个数,实际上可以减少...原创 2020-03-29 19:28:47 · 142 阅读 · 0 评论 -
19黑马笔记之二叉树的创建
19黑马笔记之二叉树的创建1 思想:一个一个节点的创建,先从根节点开始,若输入为#,则该节点为空;若不是#,则再次调用函数,给该节点创建左右孩子。最后返回该节点。2 实现代码: 并不是很常用,了解一下即可。#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>#include &l...原创 2020-04-18 18:54:39 · 142 阅读 · 0 评论 -
18黑马笔记之二叉树的非递归遍历
17黑马笔记之二叉树的非递归遍历1 直接用例子说明:节点格式:typedef struct BINTREESTACKNODE{ LinkSNode node; //挂钩 BinaryNode *root; //二叉树节点 bool flag; //出入栈时是否可输出的标志位}BinTreeStackNode;首先,将节点A进栈(初始化为false)。然后取栈顶元素,判断f...原创 2020-04-18 18:07:37 · 179 阅读 · 0 评论 -
17黑马笔记之二叉树的拷贝与释放
17黑马笔记之二叉树的拷贝与释放1 二叉树的拷贝思想: 先传进二叉树的根节点,然后先遍历其左子树,令其执行到左子树的最后节点;再遍历其右子树,递归遍历左右子树都要接收返回值(malloc出的新节点地址)。然后malloc创建新的节点并赋值,返回新的节点便可。递归条件:传进的节点不为空(绝大多数都是这个)。2 二叉树的释放: 同样的,先遍历左子树,使其先执行左子树的最后一个节点,再遍历右子树。然...原创 2020-04-18 16:43:36 · 240 阅读 · 0 评论 -
16黑马笔记之二叉树的递归遍历求树的深度
16黑马笔记之二叉树的递归遍历求树的深度1 思想: 对每一个节点求出其左右孩子的深度并返回用变量接收,然后取其最大值即可,最后返回的就是二叉树的深度。2 代码实现:#include<stdio.h>#include<stdlib.h>#include<string.h>//定义二叉树节点typedef struct BINARYNODE{ ch...原创 2020-04-18 13:24:26 · 155 阅读 · 0 评论 -
15黑马笔记之二叉树的递归遍历求叶子节点数
15黑马笔记之二叉树的递归遍历求叶子节点数1 思想: 对每一个节点遍历其左右孩子,若都为空,则是叶子节点。递归结束条件:传进的节点不为空。代码基本只是在递归遍历的基础上加了统计叶子数的变量。2 具体代码实现:例子:#include<stdio.h>#include<stdlib.h>#include<string.h>//定义二叉树节点typ...原创 2020-04-18 13:16:41 · 712 阅读 · 0 评论 -
14黑马笔记之二叉树的递归遍历
14黑马笔记之二叉树的递归遍历1 思想: 将二叉树的根节点传进去,再递归遍历左右子树。递归条件:传进的节点不为空。即if(root==NULL)就返回。2 递归遍历二叉树的方式有三种: 分为前序遍历,中序遍历,后序遍历。3 例子:具体代码实现:#include<stdio.h>#include<stdlib.h>#include<string.h>...原创 2020-04-18 12:57:48 · 143 阅读 · 0 评论 -
13黑马笔记之二叉树
13黑马笔记之二叉树1 二叉树基本概念: n(n≥0)个结点的有限集合。由一个根结点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成。2 基本特征:1)每个结点最多只有两棵子树(不存在度大于 2 的结点);2)左子树和右子树次序不能颠倒(有序树)。有序树:左右子树不能交换位置,即换句话说,兄弟之间不能互换。3 二叉树的性质与对比记忆各种二叉树:1 树: 由n(n>=0)个有...原创 2020-04-18 10:14:45 · 180 阅读 · 0 评论 -
12黑马笔记之树的存储结构
11黑马笔记之树的存储结构1 树的存储结构也分与线性存储一样,分为顺序存储和链式存储。2 树的顺序存储:1)可规定为,从上至下、从左至右将树的结点依次存入内存。2)重大缺陷:复原困难(不能唯一复原就没有实用价值)。例如双亲表示法。定义一个结构体,将数据放进结构体中,然后将节点存进数组中。//双亲表示法typedef struct SNODE{ int data; ...原创 2020-04-17 21:21:42 · 227 阅读 · 0 评论 -
11黑马笔记之树的基本概念
11黑马笔记之树的基本概念1 树的定义:由一个或多个(n≥0)结点组成的有限集合 T,有且仅有一个结点称为根(root),当 n>1时,其余的结点分为 m(m≥0)个互不相交的有限集合 T1,T2,…,Tm。每个集合本身又是棵树,被称作这个根的子树 。加粗样式2 树的结构特点:1)非线性结构,有一个直接前驱,但可能有多个直接后继(即1:n)。2)树的定义具有递归性,树中还有树。...原创 2020-04-17 19:17:30 · 145 阅读 · 0 评论 -
10黑马笔记之栈的应用_根据后缀表达式求解
10黑马笔记之栈的应用_根据后缀表达式求解1 前提:1)如果是数字,直接进栈。2)如果是运算符,依次从栈中取右操作数和左操作数进行运算,运算结果放回栈中,直至栈中剩下最后一个数字。以上个例子求出的后缀表达式为例str = “831-5*+”,831进栈,减号取两操作数31运算结果为2,放回栈中,此时栈中有8和2。5进栈, 乘号运算2和5结果为10放回去。加号运算8和10也放回去,最终栈中只...原创 2020-04-17 16:04:47 · 113 阅读 · 0 评论 -
09黑马笔记之栈的应用_中缀表达式转后缀表达式
09黑马笔记之栈的应用_中缀表达式转后缀表达式1 前提:1)数字:直接输出。2)左括号:直接进栈(优先级默认最低)。3)右括号:将栈顶符号输出,直到匹配到左括号。4)运算符:1)若一开始没有可比较直接进栈; 2)若栈顶元素优先级低,进栈; 3)若栈顶元素优先级高,将栈顶元素弹出并输出,直至低就进栈。//最后将栈中的元素遍历弹出输出。我们以char str = "8+(3-1)5"为例...原创 2020-04-17 08:51:39 · 172 阅读 · 0 评论 -
08黑马笔记之栈的应用_就近匹配(括号)
黑马笔记08之栈的应用_就近匹配(括号)思想:前提:使用栈的链式存储来实现。1)遇到左括号就放进栈中,再遇到右括号就将左括号从栈中删除。若栈中没有元素或者不是左括号,则说明右括号匹配失败。以上是判断右括号不匹配的,下面是判断左括号不匹配。2)若栈中还有元素,说明左括号多了,左括号不匹配。将栈中多余的左括号循环一个个打印出来,按下标显示相应位置。代码实现:1)头文件:#ifndef S...原创 2020-04-03 16:59:22 · 189 阅读 · 0 评论 -
07黑马数据结构笔记之队列的顺序存储(简单)
黑马数据结构笔记07之队列的顺序存储(简单)1 思想:使用数组来实现。只需要在插入删除时符合队列的先进先出思想就可以。例如先插入1,2,3.即1->2->3。在尾部插入,1是先进的,那么1就得先出,即在尾部插入,头部删除。‘代码实现:1)头文件.h:#ifndef SEQQUEUE#define SEQUEUE#include<stdio.h>#includ...原创 2020-04-03 14:52:11 · 174 阅读 · 0 评论 -
06黑马数据结构笔记之栈的链式存储(简单)
黑马数据结构笔记06之栈的链式存储(简单)1 思想:同样以挂钩的方式存储数据,但栈的链式存储与上一篇顺序存储有点区别,顺序存储在数组的尾部满足先进后出,所以每次对栈顶即数组尾部进行插入删除就可以满足。而栈的链式存储在链表的头满足先进后出,所以每次对链表头部进行插入删除就可以满足。实际上你可以按照你自己的方式满足栈的先进后出,只不过麻烦点,绕一点。//使用企业链表实现,也可传统typedef ...原创 2020-04-03 13:56:13 · 198 阅读 · 0 评论 -
05黑马数据结构笔记之栈的顺序存储(简单)
黑马数据结构笔记05之栈的顺序存储(简单)1 思想:使用固定数组来实现,交给结构体管理。栈的插入与删除都只能在栈顶操作。//存放栈数组的最大值#define MAX_SIZE 1024//管理栈结构体--1个//企业链表两个typedef struct SEQSTACK{ void* data[MAX_SIZE]; //不需要挂钩,因为是栈,连续内存 记得要加括号!!!!! i...原创 2020-04-03 13:35:07 · 146 阅读 · 0 评论 -
黑马练习之循环链表解决约瑟夫问题
黑马数据结构笔记之使用循环链表解决约瑟夫问题1 思想:一个人从1依次喊一个数,喊到指定数时,该人退出队伍,下一个人重新从1开始喊。代码实现:1)头文件:#ifndef CIRCLELIST_H#define CIRCLELIST_H//挂钩结构体typedef struct CSNode{ struct CSNode *next;}CircleSNode;//管理链表结构体...原创 2020-04-03 13:21:04 · 202 阅读 · 0 评论 -
04黑马数据结构笔记之(双向)循环企业链表(小挂钩)
黑马数据结构笔记03之(双向)循环企业链表(小挂钩)1 思路:循环企业链表几乎与企业链表一样。何为循环,就是使链表的尾部不指向NULL,而指向链表的开头,即指向头结点,clist->head.next=&(clist->head); //使链表尾部指向头结点–循环。同样以一个结构体管理链表,链表内使用挂钩连接存储数据。//挂钩结构体typedef struct CSNo...原创 2020-04-03 11:59:09 · 131 阅读 · 0 评论 -
03黑马数据结构笔记之(单向)企业链表(小挂钩)
黑马数据结构笔记03之企业链表(小挂钩)1 思路:链表不直接存放插入的整个数据,只存放数据的首地址,也就是我们自定义的小挂钩,实际上是一个节点,该节点只有一个用于连接数据的next指针。 例如我们在mian函数看数据插入时,将类型转为挂钩类型插入,链表一次将挂钩连接起来。//小节点,即挂钩typedef struct Node{ struct Node *next;}SNode;//...原创 2020-04-03 11:01:23 · 164 阅读 · 0 评论 -
02黑马数据结构笔记之单向链表搭建(list)
黑马数据结构笔记02之单向链表搭建(list)1 思路:以STL的容器list类似,将各个数据节点存放在链表当中。实现是靠一个结构体来管理各个数据节点 。//定义一个节点类型typedef struct Node{ //接收任何数据 void* data; struct Node *next; }SNode;//定义一个结构体管理链表typedef struct LinkLi...原创 2020-04-03 10:27:17 · 258 阅读 · 0 评论 -
01黑马数据结构笔记之动态搭建数组(vector)
黑马数据结构笔记01之动态搭建数组1 思路:类似STL的容器vector,动态的开辟内存存放数据,内存不够时以两倍增长。提供相应的增、删、查等函数。主要是利用一个结构体来管理数组。//记录数组的成员typedef struct MyArray{ int size; //数组实际大小 int *addr; //存放数据的实际内存 int capacity; //数据的容量}D...原创 2020-04-03 09:48:11 · 187 阅读 · 0 评论