C语言相关
文章平均质量分 73
一些c语言相关的代码
HMTT
有任何问题,可以使用QQ824626339联系本人,博客私信不常看
展开
-
数据结构相关博客目录
数据结构相关博客目录数据结构基本概念及简单算法分析线性表单链表的类定义;单链表的插入与删除;带头结点的单链表循环链表的类定义;用循环链表解决约瑟夫问题双向链表的基本操作栈和队列栈的抽象数据类型;栈的链接存储表示队列的抽象数据类型;队列的链接存储表示树与森林二叉树的抽象数据类型二叉树的顺序表示;二叉树的链表存储表示二叉树的中序遍历;前序遍历;后序遍历(递归和非递归实现)不用栈和递归的二叉树中序遍历线索;中序线索化二叉树树的存储表示树与二叉树的转换;森林与二叉树的转换;森林的遍历原创 2020-11-18 20:41:35 · 519 阅读 · 0 评论 -
AOE网与关键路径、关键路径算法
AOE网与关键路径在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,边上的权值表示活动持续的时间,称这样的有向图为边表示活动的网,简称 AOE网(activity on edge network)。AOE网中没有入边的顶点称为源点,没有出边的顶点称为终点。AOE网具有以下两个性质:只有在进入某顶点的各种活动都已经结束,该顶点表示的事件才能发生。只有在某顶点所代表的事件发生后,从该顶点出发的活动才能开始。如果用AOE网络来表示一项工程,那么,仅仅考虑各个活动之间的优先关系还不够,更多原创 2020-11-18 20:07:31 · 2415 阅读 · 0 评论 -
AOV网与拓扑排序、拓扑排序算法
AOV网与拓扑排序AOV网在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,称这样的有向图为顶点表示活动的网,简称 AOV网(activity on vertex network)。AOV网中的弧表示了活动之间存在的某种制约关系。在AOV网中不能出现回路,否则意味着某活动的开始要以自己的完成为先决条件,显然,这是荒谬的。因此判断AOV网所代表的工程是否能顺利进行,即判断它是否存在回路。而测试AOV是否存在回路的方法,就是对AOV网进行拓扑排序。拓扑排序设 G=(V,E)G=(V原创 2020-11-16 20:54:49 · 1800 阅读 · 0 评论 -
最短路径、Dijkstra算法、Floyd算法
最短路径在非网图中,最短路径是指两个顶点之间经历的边数最少的路径,路径上的第一个顶点称为源点,最后一个顶点称为终点。在网图中,最短路径是指两点之间经历的边上的权值之和最少的路径。Dijkstra算法Dijkstra算法用于求单源点路径问题,问题描述如下:给定带权有向图 G=(V,E)G=(V,E)G=(V,E) 和源点 v∈Vv \in Vv∈V,求从v到G中其余各顶点的最短路径。迪杰斯特拉提出了一个按路径长度递增的次序产生最短路径的算法,其基本思想是:设置一个集合 S 存放已经找到最短路径的顶点原创 2020-11-14 22:00:39 · 396 阅读 · 0 评论 -
最小生成树、Prim算法、Kruskal算法
最小生成树设 G=(V,E)G = (V,E)G=(V,E) 是一个无向连通图,生成树上各边的权值之和称为该生成树的代价,在G的所有生成树中,代价最小的生成树叫最小生成树。MST性质最小生成树具有MST性质:假设 G=(V,E)G=(V,E)G=(V,E) 是一个无向连通网,U是顶点集合V的一个非空子集。若 (u,v)(u,v)(u,v)是一条具有最小权值的边,其中u∈U,v∈V−Uu \in U, v \in V-Uu∈U,v∈V−U,则必存在一棵包含边 (u,v)(u,v)(u,v) 的最小生成树原创 2020-11-12 22:24:48 · 298 阅读 · 2 评论 -
哈夫曼树及哈夫曼编码、哈夫曼算法
哈夫曼树及哈夫曼编码、哈夫曼算法哈夫曼树相关概念哈夫曼树也称最优二叉树在实际中有着广泛的应用。下面有几个相关概念。叶子结点的权值叶子节点的权值是对叶子结点赋予一个有意义的数值量。二叉树带权路径长度设二叉树具有n个带权的叶子结点,从根结点到各个叶子结点的路径长度与相应叶子结点权值的乘积之和叫做二叉树的带权路径长度,记为:WLP=∑k=1nwklkWLP = \sum\limits^n_{k=1}w_kl_kWLP=k=1∑nwklk,其中,wkw_kwk为第k个叶子结点的权值,lkl_kl原创 2020-11-12 20:09:49 · 1271 阅读 · 0 评论 -
线索二叉树、中序线索二叉树的创建和遍历
线索二叉树按照某种遍历次序对二叉树进行遍历,可以把二叉树中的所有结点排成一个线性序列。在具体应用中,有时需要访问二叉树中的结点在某种遍历序列中的前驱和后继,此时,在存储结构中应保存结点在某种遍历序列中的前驱和后继。这些指向前驱和后继结点的指针称为线索,加上线索的二叉树称为线索二叉树,相应地,加上线索的二叉链表叫做线索链表。线索链表结构如下:字段:ltag, lchild, value, rchild, rtagltag={0,lchild指向该结点的左孩子1,lchild指向该节点的前驱rtag={0原创 2020-11-10 20:49:39 · 6052 阅读 · 2 评论 -
二叉树排序树插入、创建、删除和查找
二叉树排序树创建、插入、删除和查找二叉排序树原创 2020-11-08 19:45:57 · 4078 阅读 · 3 评论 -
折半查找
折半查找算法思维折半查找是顺序查找通过每次减少一半的待选元素来提高查找速度算法设计循环执行下面操作指导待选元素数量为0对中间元素进行匹配若匹配,返回相关数据若不匹配,将待选元素数组以中间为界,缩小一半,回到 1算法实现// 折半查找/*arr:要查找的有序数组len:数组长度x:要查找的元素*/int search_binSearch(int* arr, int len, int x){ int low = 0, height = len-1; in原创 2020-11-06 19:42:16 · 162 阅读 · 0 评论 -
基数排序-最低位优先法
基数排序-最低位优先法算法思维基数排序是一种非比较型的排序,其原理是把数字按位数分割,然后对每一位进行分配和收集最低位优先法就是从数字的最低为开始,依次分配和收集最低位优先法相较于最高位优先法,最低位优先法不需要分子序列算法设计确定数字最高位数对每个数字的每一位从低位到高位进行下面操作先按照位数大小进行分配,然后按照排列顺序进行收集,根据分配收集的特性,可以用队列来实现算法实现// 基数排序,最高位优先法/*len_number:数字最长位数*/void sort_rad原创 2020-11-04 21:55:31 · 5793 阅读 · 0 评论 -
递归的归并排序
递归的归并排序算法思维利用递归的特性,先将当前序列的子序列并归,再并归当前序列算法设计递归结束条件,当前序列的长度为1并归前一个子序列归并后一个子序列对当前序列进行并归算法实现// 递归归并排序算法void sort_mergeSort(int* arr, int len, int mode){ int* arr_tmp = (int* )malloc(sizeof(int) * len); sort_mergeSort_main(arr, arr_tmp, 0原创 2020-11-04 19:55:48 · 201 阅读 · 0 评论 -
迭代的并归排序
迭代的并归排序算法思维并归的含义是将两个或两个以上的有序序列合并成一个新的有序序列并归排序的时间复杂度为nlognn \log nnlogn,需要申请与待排序序列相等的辅助空间,是一种稳定的排序方法算法设计将初始待并归序列长度设为 1将两个相邻的未并归的子序列并归成一个新的有序序列循环执行2直到所有子序列并归成一个有序序列算法实现// 迭代并归排序/*mode: 非0:升序, 0:降序*/void sort_mergeSort_noRecursion(int *arr,原创 2020-11-02 22:06:34 · 353 阅读 · 0 评论 -
堆排序
堆排序算法思维堆排序也是一种选择排序,每次选出无序序列中一个最大或最小的元素并放到有序序列中去因为堆排序是从后往前放的,所以升序要用大根堆,降序要用小根堆堆排序在最坏的情况下时间复杂度也是O(nlogn)O(n \log n)O(nlogn),并且只需要一个辅助空间算法设计创建变量 i ,表示未排序序列的末尾从未排序序列末尾开始,把未排序序列视作完全二叉树,从右往左,从下往上遍历每个非叶子节点,并对结构混乱(节点与其孩子比较,不是最大或最小)的结点进行调整(与最大或最小的孩子进行交换)原创 2020-11-02 20:32:43 · 157 阅读 · 0 评论 -
直接选择排序
直接选择排序算法思维直接插入排序是一种非常简单、容易写的排序在没有排好序的序列中,每次选择一个最大或最小的元素,加入有序序列,直到整个序列有序算法设计创建索引变量 i ,i 的初值为0;创建数值变量current,表示当前为止最大或最小的元素创建索引变量flag,表示current值所对应的索引从包括 i 的子序列开始,往后遍历若找到可替换current值的元素,替换并将flag置为当前循环的索引i 加 1,并重复4,直到最后一个元素算法实现// 直接选择排序void so原创 2020-11-02 19:34:38 · 149 阅读 · 0 评论 -
快速排序
快速排序算法思维快速排序是对起泡排序的一种改进快速排序的基本思想是,通过一趟排序将待排序的记录分割成独立的两部分,一部分的元素均小于另一部分的元素,然后再对两部分进行快速排序,直到整个序列有序算法设计...原创 2020-11-02 19:17:33 · 163 阅读 · 0 评论 -
起泡排序
起泡排序算法思维起泡排序是一种简单的交换排序起泡排序是从头到尾循环比较两个相邻元素,如果顺序错误就会交换这两个元素,直到序列有序算法设计设置一个参数 count 用来记录每次循环交换的次数将 count 赋值为 0用循环依次比较每两个相邻元素的值,如果顺序错误,则交换并这两个元素,并将 count 加 1循环完成后,如果 count 值仍为 0,说明序列有序,否则重复2算法实现// 判断int sort_judgeWithMode(int num1, int num2, int原创 2020-10-31 21:38:18 · 727 阅读 · 0 评论 -
希尔排序
希尔排序算法思路希尔排序又称缩小增量排序,也是一种插入排序希尔排序的思路是将整个待排序记录分割成若干个子序列分别进行插入排序然后每排序一次后将增量减少再进行排序当整个序列“基本有序”时,再对全体记录进行一次排序希尔排序相较于普通插入排序,改进主要在减少元素之间交换次数上算法设计第一趟排序将增量 span 设为 数组长度的一半即 len/2然后根据增量对各个子序列进行插入排序当增量为1时结束排序将增量减少一半,当增量为0时赋值为1,并重复2算法实现// 判断int sort原创 2020-10-31 21:18:06 · 197 阅读 · 0 评论 -
链表插入排序
链表插入排序算法思维将第一个元素看作一个有序序列将后面的元素按升降次序插入有序序列,一直重复直到整个序列有序设计思维用带有头节点的列表 list 方便运算因为升序和降序只有判断方法不一样,所以可以设置一个mode变量表示排序方式创建一个新的链表 list_sorted 存放有序序列,按反序放置,此时有序数列的最后一个元素就是此链表的第一个元素取出一个未排序的元素,找到相应的位置并插入,重复4直到所有结点有序再按照反序把 list_sorted 中的元素插入 list中,即可得到最后结原创 2020-10-31 20:40:09 · 381 阅读 · 0 评论 -
直接插入排序
直接插入排序算法思路将第一个记录看成有序的子序列从第二个记录起逐个进行插入,从而得到一个新的有序子序列,直到整个数列有序原创 2020-10-31 19:27:32 · 209 阅读 · 0 评论 -
图的广度优先搜索
图的广度优先搜索算法描述找到一个未被访问过的结点v0v_0v0,并访问依次访问v0v_0v0每一个未被访问过的相邻节点,并对每个符合条件的相邻结点重复2,直到所有已被访问过的结点的所有相邻结点都被访问到若还有未被访问过的结点,重复1直到所有结点都被访问设计思维先给所有结点编号,再创建一个相应大小的数组来存储每个结点的访问信息,数组的索引就是对应结点的编号,当结点未被访问时对应的值为1,当访问结点时将对应值置为0根据访问顺序,要当所有距离v0v_0v0近的结点都被访问完时才访问更远的原创 2020-10-29 21:04:02 · 209 阅读 · 0 评论 -
图的深度优先搜索
图的深度优先搜索算法描述找一个未被访问过的结点v0v_0v0,并访问它找到该节点一个未被访问过的相邻结点v1v_1v1,并访问v1v_1v1,再找v1v_1v1未被访问过的相邻结点。重复2,直到某个结点vxv_xvx没有未被访问过的相邻结点,这时退回上一个访问的结点再重复2,直到访问完v0v_0v0的所有相邻结点若此时仍有未被访问过的结点,重复1设计思维可以给每个结点一个序号,然后创建一个相应长度的数组,初始化为全0数组,该数组索引代表结点序号,内容表示结点是否被访问过。若访原创 2020-10-29 20:08:07 · 157 阅读 · 0 评论 -
用邻接矩阵和邻接表创建图
邻接矩阵// 创建图邻接矩阵/*g:初始矩阵arr:n%3=0表示起点,n%3=1表示终点,n%3=2表示权值arrLen:表示arr的长度haveDi:0 表示无向,非0 表示有向*/void graph_createAdjacencyMatrixByArrWithWeight(int **g, int* arr, int arrLen, int haveDi){ for(int i = 0; i < arrLen; i += 3) { g[arr[原创 2020-10-27 21:44:38 · 993 阅读 · 0 评论 -
循环单链表和循环列表解决约瑟夫问题
循环列表解决约瑟夫问题// 约瑟夫问题// n:规定的数SNode* JosephusProblem(SNode* cLink, int n){ int i = 0; /* 因为只有头指针所以先加一 当n为1或2时会有问题,其他情况没问题 */ i = (i+1)%n; cLink = cLink->next; // 跟上面同步往后移动 while(cLink->next != cLink) { i原创 2020-10-27 20:10:20 · 159 阅读 · 0 评论 -
不用栈的二叉树中序遍历
不用栈的二叉树中序遍历// 中序遍历非栈非递归void inOrder_noRecursion_noStack(TreeNode* r, char* pattern){ TreeNode* current = r; while(current) { if(current->lchild == NULL) { // 当前节点没有左孩子,所以是应该访问的结点 printf(pattern, cur原创 2020-10-27 19:34:13 · 1545 阅读 · 0 评论 -
链表栈和队列的实现
链表栈和队列栈#include "nodes.h"// 链表栈/*带头指针,头指针的值表示栈的深度*/SNode* createStack(){ return createSNode(0);}// 入栈void stack_push(SNode* shead, int value){ addSNodeToTheNext(shead, createSNode(value)); shead->value++;}// 出栈SNode* stack_p原创 2020-10-25 22:14:23 · 170 阅读 · 0 评论 -
二叉树遍历递归与非递归实现
先序遍历// 先序遍历void preOrder(TreeNode* r, char* pattern){ if(r == NULL) { return; } printf(pattern, r->value); preOrder(r->lchild,pattern); preOrder(r->rchild,pattern);}// 一个样例int main(){ int arr[7] = {1,2原创 2020-10-25 22:13:12 · 173 阅读 · 0 评论 -
二叉树创建
二叉树相关创建二叉树// 通过数组创建二叉树,0表示没有结点TreeNode* createTreeByArr(int* arr, int len){ TreeNode* root= createTreeNode(arr[0]); createTreeByArr_main(arr, len, 1, root ,'l'); createTreeByArr_main(arr, len, 2, root ,'r'); return root;}// 递归创建二叉树原创 2020-10-23 22:37:20 · 149 阅读 · 0 评论 -
C语言一些常用结点和结点操作
C语言练习用的一些常用结点和操作单列表// 单列表结点typedef struct{ int value; struct SNode* next;}SinglyLinkedListNode,SLLNode,SNode;/*value:新单列表结点的值return:新结点,next会被赋值为空*/SNode* createSNode(int value){ SNode* node = (SNode*)malloc(sizeof(SNode)); node原创 2020-10-22 22:02:49 · 2165 阅读 · 2 评论