数据结构
wiyoo0
菜鸟一枚 爱更新菜鸟教程 联系vx:WZSZQTB
展开
-
直接插入排序
对于算法先了解一下他的动画演示效果是非常有启发的可以先看这个视频 :直接插入排序动画演示看完可以自己先动手写写代码缕缕思路,相对来说比较简单代码演示/* // 直接插入排序 */#include<stdio.h>#define N 10void InsertSort(int num[],int len) //带入数组和数组长度 { int i,j,temp; //i,j用来循环 temp存放临时变量 for(i=1;i<len;...原创 2021-11-22 14:46:09 · 491 阅读 · 0 评论 -
快速排序(附优化方案)
前言快速排序的效率比冒泡排序相对快一些快速排序的平均时间复杂度和最坏时间复杂度分别是O(nlgn)、O(n^2)而冒泡排序的时间复杂度是O(n^2)关于冒泡排序的操作是怎样变化的看这个视频秒懂算法快速排序-动画4分钟精讲看不明白多看几遍,拿笔记本画一画思考:发现快速排序输入数组太过死板,C语言自身又不支持动态数组,其实网上已经有人实现了,待研究发掘下思路;代码实现先看普通版本的快速排序//快速排序#include "stdio.h"#include "s.原创 2021-11-18 11:26:51 · 524 阅读 · 0 评论 -
二叉排序树(草稿)
代码存在bug 运行不起来两个版本1#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct//关键字结构体 { int key;//关键字项 int otherinfo;//其他数据域 }ElemType;//每个节点的数据域的类型 typedef struct BSTNode//二叉树结构体 { ElemType data;//每个节点的数据域..原创 2021-11-17 15:24:04 · 97 阅读 · 0 评论 -
斐波那契查找(黄金分割查找)
前言这个算法是困惑我比较久的,可能是理解能力比较差,找了许多资料让我觉得讲的明白的文章是:斐波那契查找原理——附python和C++实现 - 知乎建议看完二分查找法再看我上面的知乎文章,再来看我的代码这种算法在某种的环境下效率能比二分查找法效率高些,因为黄金比例0.618比较妙和玄学代码实现我用的是C语言实现的#include<stdio.h>#define MAXSIZE 20void fibonacci(int *f) //构建斐波那契序列..原创 2021-11-12 11:39:46 · 176 阅读 · 0 评论 -
斐波那契数列
简介斐波那契数列是:1、1、2、3、5、8、13、21、34、……最细看就会发现其中的规律除了第一第二为是1 后面的每一位都是前两位的和而且越往后面 n/n+1 都会越来越接近黄金比例0.618...印象中有些大厂的面试题就有他代码实现代码实现也是非常简单的,掌握了其中的规律每位数n都是(n-1)+(n-2)的和#include "stdio.h"int fibo(int n){ return n==1||n==2?n=1:fib(n-1)+fib(n-2);}原创 2021-11-11 17:32:23 · 96 阅读 · 1 评论 -
二分查找法(折半查找)
二分查找是在已经排好序的数组下去查找数字的数组下标思想折半查找的基本思想是:减小查找序列的长度,分而治之地进行关键字的查找。折半查找的实现过程是:先确定待查找记录的所在范围,然后逐渐缩小这个范围,直到找到该记录或查找失败(查无该记录)为止。例如有序列:1 1 2 3 5 8 13 21 34 55 89(该序列包含 11 个元素,而且关键字单调递增。),现要求查找关键字 key 为 55 的记录。我们可以设指针 low 和 high 分别指向关键字序列的上界和下界,指针 mid 指向序列的中间位原创 2021-11-11 15:17:31 · 700 阅读 · 1 评论 -
图--邻接表
邻接表是图结构中的一种存储结构,适用于存储无向图和有向图。邻接表存储图的实现方式是,给图中的各个顶点独自建立一个链表,用节点存储该顶点,用链表中其他节点存储各自的临界点。与此同时,为了便于管理这些链表,通常会将所有链表的头节点存储到数组中(也可以用链表存储)。也正因为各个链表的头节点存储的是各个顶点,因此各链表在存储临界点数据时,仅需存储该邻接顶点位于数组中的位置下标即可。将图画出来,在编写代码思路会比较清晰从图中我们知道,顶点表的各个结点由data和firstedge两个域表示,da.原创 2021-09-24 11:24:42 · 3175 阅读 · 0 评论 -
克鲁斯卡尔算法(Kruskai)和普里姆算法(Prim)
克鲁斯卡尔算法(Kruskai)思路步骤: 1、将边全部提取出来放入一个列表中,从权重小到大依次排序2、将最小权重的边放入图中与对应的顶点相连3、要确保边填入后不能形成环,如果形成环就丢弃这条边4、知道加入了(n-1)条边最小生成树构造完成。(n是树中顶点的数量)普里姆算法(Prim)思路步骤:1、从顶点开始出发,选择权重最小的边连接。2、连接完新的顶点后继续找最小权重边,与已经连接的全部顶点所连接的边都要对比。3、连接后判断是否形成环,形成的...原创 2021-09-28 09:27:01 · 3618 阅读 · 0 评论 -
图的存储结构
我们知道,数据之间的关系有 3 种,分别是 "一对一"、"一对多" 和 "多对多",前两种关系的数据可分别用线性表和树结构存储,本节学习存储具有"多对多"逻辑关系数据的结构——图存储结构。与链表不同,图中存储的各个数据元素被称为顶点(而不是节点)。拿图 1 来说,该图中含有 4 个顶点,分别为顶点 V1、V2、V3 和 V4。无向图: V1 与 V4 和 V2 建立着联系,V4 与 V1 和 V3 建立着联系,以此类推图 1 中的图仅是图存储结构的其中一种,数据之间 "多对多" 的关系...原创 2021-09-15 14:51:43 · 116 阅读 · 0 评论 -
哈夫曼树、哈夫曼编码原理
哈夫曼树又称 “最优树” , 是一类带权路径最短的树,这种树有着广泛的应用哈夫曼树作用于内存压缩,使得空间更加节省。路径:在一棵树中,一个结点到另一个结点之间的通路,称为路径。图 1 中,从根结点到结点 a 之间的通路就是一条路径路径长度:在一条路径中,每经过一个结点,路径长度都要加 1 。例如在一棵树中,规定根结点所在层数为1层,那么从根结点到第 i 层结点的路径长度为 i - 1 。图 1 中从根结点到结点 c 的路径长度为 3结点的权:给每一个结点赋予一个新的数值,...原创 2021-09-08 18:14:44 · 319 阅读 · 0 评论 -
在树中查找一个节点的父节点及下标
树的结构是这样的我们给他录入数据后开始查找话不多说上代码#include "stdio.h"#include "stdlib.h"#define max 200 //最大值200 typedef struct node{ // 节点结构 char data; //节点数据 int parent; //节点的父节点的下标 }node;typedef struct tree{ //树结构 node tnode[max]; //节点 ..原创 2021-09-06 16:34:57 · 781 阅读 · 0 评论 -
二叉树遍历(前中后序遍历代码及注释)
我们将用递归的方式前中序的遍历出来下面的二叉树这边代码的设定是如果左孩子或者右孩子为空的话则输入空格接下来代码展示:#include "stdio.h"#include "stdlib.h"typedef struct bitnode{ //定义二叉树节点 char data; //节点的数据为字符 struct bitnode *lchild,*rchild; //每个节点都有左孩子右孩子 }bitnode,*bittree; void cre原创 2021-09-01 11:31:20 · 1319 阅读 · 0 评论 -
数据结构,什么是数据,什么是结构
数据从小到大的排序是:数据项->数据元素->数据对象->数据基本单位是数据元素数据项是最小的不能分割的结构:结构有什么原创 2021-08-31 10:50:40 · 589 阅读 · 0 评论 -
树与二叉树
对于一个结点,拥有的子树数(结点有多少分支)称为结点的度一棵树的度是树内各结点的度的最大值经过前人的总结,二叉树具有以下几个性质:二叉树中,第 i 层最多有 2i-1个结点。 如果二叉树的深度为 K,那么此二叉树最多有 2K-1 个结点。 二叉树中,终端结点数(叶子结点数)为 n0,度为 2 的结点数为 n2,则 n0=n2+1(以上的图供你套公式自己理解)满二叉树:每个节点都是满的没有空缺完全二叉树:如果二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从.原创 2021-08-26 15:21:20 · 169 阅读 · 0 评论 -
BF算法(暴力破解算法)
在主串里匹配子串字符搜索上面一排是主串,下面一排是子串,接下来在主串里面搜索子串首先,对于这个问题有一个很单纯的想法:从左到右一个个匹配,如果这个过程中有某个字符不匹配,就跳回去,将模式串向右移动一位。这有什么难的?我们可以这样初始化:之后我们只需要比较i指针指向的字符和j指针指向的字符是否一致。如果一致就都向后移动,如果不一致,如下图:A和E不相等,那就把i指针移回第1位(假设下标从0开始),j移动到模式串的第0位,然后又重新开始这个步骤:下面写了个例...原创 2021-08-19 16:00:41 · 279 阅读 · 1 评论 -
C语言数据结构创建矩阵,及代入数据
创建一个这样的矩阵数据由我们插入(定位坐标行列及插入的数据)代码如下:思路:将每个坐标节点和我们插入的节点坐标做对比,如果行列坐标都相等,则value置1并输出其相应的数据,否则value还是为0,value为0 的坐标节点数据全都为0,此代码是将每个节点与(1,1,1),(2,3,5),(3,1,3)(行,列,数据)三个给定的节点坐标作对比,行列坐标对应则将数据代入。#include<stdio.h>#define number 3typedef struct { //原创 2021-08-16 17:39:59 · 1895 阅读 · 0 评论 -
串的块链存储结构
串的块链:就是将一串字符串分割拆开储存在链表里面,每个节点中可以存储多个单字节。这是普通的链表每个节点存储一个字符:下面是块链,每个节点存储多个字符:下面是串的块链的写入和输出,每个节点存储3个字节的代码:#include"stdio.h"#include "stdlib.h"#include "string.h"typedef struct jiegou{ //定义结构体 char a[3]; //串的块链 数据域储存多个字符 struc..原创 2021-08-12 17:08:49 · 1660 阅读 · 0 评论 -
串的堆分配存储结构
以动态数组为例子该程序可实现将两个串("data.bian" 和 "cheng.net")合并为一个串代码如下:#include "stdio.h"#include "stdlib.h"#include "string.h"int main(){ char *a=NULL; //定义个空指针 char *b=NULL; a=(char*)malloc(10*sizeof(char)); //分配动态内存 10个char b=(char*)malloc(10*size原创 2021-08-11 18:22:26 · 359 阅读 · 0 评论 -
顺序队列(进队出队)
#include <stdio.h>#include "stdlib.h"int enQueue(int *a,int rear,int data){ //入队 数组a 队尾 数据 a[rear]=data; //a[0]=元素 rear++; //每入一次队尾+1 return rear; //返回队尾 } void deQueue(int *a,int front,int rear){ //出...原创 2021-08-09 17:59:02 · 1627 阅读 · 1 评论 -
链栈的基本操作(入栈,出栈)
链栈,即用链表实现栈存储结构。链栈的实现思路同顺序栈类似,顺序栈是将数顺序表(数组)的一端作为栈底,另一端为栈顶;链栈也如此,通常我们将链表的头部作为栈顶,尾部作为栈底。将链表头部作为栈顶的一端,可以避免在实现数据 "入栈" 和 "出栈" 操作时做大量遍历链表的耗时操作。链表的头部作为栈顶,意味着:在实现数据"入栈"操作时,需要将数据从链表的头部插入; 在实现数据"出栈"操作时,需要删除链表头部的首元节点 因此,链栈实际上就是一个只能采用头插法插入或删除数据的链表。...原创 2021-08-09 11:48:30 · 5965 阅读 · 0 评论 -
顺序栈的原理和基本操作
顺序栈,即用顺序栈实现栈存储结构,使用栈存储结构操作数据元素必须遵守 "先进后出" 的原则。如果你仔细观察顺序表(底层实现是数组)和栈结构就会发现,它们存储数据的方式高度相似,只不过栈对数据的存取过程有特殊的限制,而顺序表没有。(栈要遵循先入后出)这里给出使用顺序表模拟栈存储结构常用的实现思路,即在顺序表中设定一个实时指向栈顶元素的变量(一般命名为 top),top 初始值为 -1,表示栈中没有存储任何数据元素,及栈是"空栈"。一旦有数据元素进栈,则 top 就做 +1 操作;反之,原创 2021-08-06 15:49:26 · 1482 阅读 · 0 评论 -
双向链表的增删(插入,删除)
先创建双向链表1,2,3:在第二节点的位置插入数据域为4的新节点:插入的步骤如图顺序来插入删除节点和单链表操作相似代码如下:#include <stdio.h>#include <stdlib.h>typedef struct line{ struct line * prior; //前驱 int data; //数据域 struct line * next; //后驱 }line; //l..原创 2021-08-04 17:10:31 · 277 阅读 · 0 评论 -
单链表的增删查(增加,删除,查询)
代码如下#include "stdio.h"#include "stdlib.h"struct student{ char name[20]; int num; int math;};struct Node{ //表的结构体 struct student data; //数据域 struct node *next; //指针域 };struct Node* creatlist() //创建一个链表 带头结点 { struct Node* headNode = (st原创 2021-08-02 17:35:06 · 119 阅读 · 0 评论 -
链表的创建和插入
#include "stdio.h"#include "stdlib.h"#include "malloc.h"struct Node{ //表的结构体 int data; //数据域 struct node *next; //指针域 }; struct Node* creatlist() //创建一个链表 带头结点 { struct Node* headNode = (struct Node*)malloc(sizeof(struct Node)); //创建头节点分配动态.原创 2021-07-28 13:53:55 · 252 阅读 · 0 评论 -
顺序表的基本操作(插入,删除,查找,更改)
转载自此网站点击蓝色字体查看原创 2021-07-26 15:26:36 · 1013 阅读 · 0 评论 -
创建一个顺序表
#include <stdio.h>#include <stdlib.h>#define Size 5 //对Size进行宏定义,表示顺序表申请空间的大小typedef struct Table{ //定义个顺序表结构体 int * head;//声明了一个名为head的长度不确定的数组,也叫“动态数组” int length;//记录当前顺序表的长度 int size;//记录顺序表分配的存储容量}table; //将结构体名字用t.原创 2021-07-26 14:10:59 · 2955 阅读 · 0 评论 -
冒泡排序代码详解注释
#include <stdio.h>int main(){ int nums[10] = {4, 5, 2, 10, 7, 1, 8, 3, 6, 9}; int i, j, temp; //冒泡排序算法:进行 n-1 轮比较(n-1是因为10个数只比较9次) for(i=0; i<10-1; i++){ //每一轮比较前 n-1-i 个,也就是说,已经排序好的最后 i 个不用比较 for(j=0; j<10-1-i.原创 2021-06-30 09:13:54 · 332 阅读 · 0 评论