三十天挑战数据结构(C语言)
一个数据结构小菜鸟的自我奋斗历程
六六_
这个作者很懒,什么都没留下…
展开
-
三十天挑战数据结构(15)堆排序补充:C语言代码实现
上一篇博客里详细地展示了堆排序是怎么实现的,其实它看上去思路挺复杂但是C语言程序实现起来蛮简单。主要是通过循环来在二叉树上不断遍历调整结点顺序,形成大顶堆(或小顶堆)并且移走已经确定位置的那个结点。这里实现还是按照上篇博文中的大顶堆来实现:直接放代码好了:#include<stdio.h>#include<stdlib.h>void HeapSort(int *s, int length);void HeapAdjust(int *s, int v, int leng原创 2020-07-07 15:43:40 · 92 阅读 · 0 评论 -
三十天挑战数据结构(14)堆排序——十分钟带你透彻领悟
数据结构第九章内部排序简单的非常简单易懂好理解,难的非常??绕(起码对于一个初学者我觉得有点算法光看书来并不太好理解),堆排序就是其中一个。堆排序我自己看了很多参考资料搜了很多博客,看代码也觉得乱乱的,一直拖着没有来解决它,直到今早上临近ddl迫不得已要把书上习题搞定,再看了几遍,在前几次的积淀下这次居然莫名其妙地就明白了。总之它的思路在你明白了之后还是很清晰简单的,所以我觉得它值得单独用一篇文章来好好讲讲,让自己也透彻地领悟!首先我们大致要明白是基于“树”的操作(大部分我觉得都是二叉树),那么就需要原创 2020-06-18 12:20:43 · 143 阅读 · 0 评论 -
三十天挑战数据结构(13)几种内部排序方法的通俗解释
简单排序顾名思义最简单的排序方式,包括除了希尔排序之外的所有插入排序、冒泡排序和简单选择排序。其所需平均时间为O(n^2),辅助存储为O(1)。**A. 直接插入排序:**在建立存储数据结构的时候便一个一个插入来建立,按照大小关系让每个数据起初就处于它“该在的位置”。或是若原先就有一个数据组,需要插入一些新的数据,则将这些数据插入到它应该在的位置。**B. 2-路插入排序:**可以理解有一个循环链表,将数据依次插入进去,比标记点大的插入到标记点右边的序列,反之插入左边的序列,再重复该过程最后让这些..原创 2020-06-14 23:38:34 · 233 阅读 · 0 评论 -
三十天挑战数据结构(12)图的存储结构之邻接矩阵
图的存储结构最简单的就是邻接表,简言之就是对于n个顶点的一张连接图用n*n的矩阵来表示。初始状态除了对角线上的元素全部置0,其他位置都置为无穷大,表示没有边相邻,再慢慢添加边。对于有边连接的两个点m和n,在邻接矩阵中将(m,n)和(n,m)都设为1。完整建立代码:#include <stdio.h>#include <stdlib.h>#define MAXVEX 5#define INFINITE 65535typedef int Edgetype;typede原创 2020-06-13 01:01:38 · 255 阅读 · 0 评论 -
三十天挑战数据结构(11)图的最短路径之Dijkstra算法
猝不及防地进入了“图”专题…关于图的集中储存方法后面来补吧,先把关键算法一个Dijkstra算法一个Floyd算法给写了!首先我们还是和之前一样,给出一个图并且确定它的存储结构:最初学这个算法是在离散数学里面,当时也是急于复习,考前看了几遍勉强会算了,考完就忘差不多了。现在数据结构又遇到了它,会多一些印象,但还是重新学起为好。Dijkstra算法的核心思想就是分步去对每个顶点求到达它的每一步的最小路径。举个最简单的栗子,要求上图中v0到v3的最短路径,我们可以通过v0到v1和v0到v4的最短路径加原创 2020-06-12 22:30:10 · 1451 阅读 · 0 评论 -
三十天挑战数据结构(10)最小生成树之克鲁斯卡尔(Kruskal)算法
不同于克里姆算法,是以顶点为根出发进行查找路径,克鲁斯卡尔算法是通过最短边来查找路径。只不过这次存储结构是用边表结构,并且按照权重升序来存储。图还是和上一篇Prim算法里的一样:边表存储结构:完整代码:#include <stdio.h>#include <stdlib.h>#define MAXVEX 9typedef struct{ int begin; int end; int weight;} EdgeNode;typed原创 2020-06-12 17:57:33 · 222 阅读 · 0 评论 -
三十天挑战数据结构(9)最小生成树之普里姆(Prim)算法
咕了无数天之后猛更一波。其实是因为前两天忙于数据结构结课大作业,正好需要图的各种知识,所以暂时把树这一部分先跳过了。离期末还有一个月的感觉就是,我真的学不完辣!!!数据结构大作业给我的感觉是盲整邻接表(其实还没太学明白但是硬着头皮写出来了…)然后我明白了之前被它困扰其实不是概念问题,道理大家都懂,只是我的C语言太惨不忍睹了…经过这么将近十篇博客多多少少还是学懂了一些,弥补了C在指针啊,结构体啊这些地方的缺憾,总之慢慢来吧,鼓励一下自己!废话不多说了,来分析一下这个最小生成树之普里姆(Prim)算法!原创 2020-06-12 16:13:40 · 201 阅读 · 0 评论 -
三十天挑战数据结构(8)KMP算法
上一篇博客里提到,朴素的匹配算法效率太低,因此三位前辈:D.E.Knuth、J.H.Morris和V.R.Pratt发表了一种相对高效的匹配算法,简称KMP算法。要理解这种算法其实并不难,虽然起初看了无数视频看了许多书籍都没有办法很透彻的理解,但经过一点一点分析,总会有一天将它思考透彻的。总的来讲,这个算法做到的其实就是将不必要的匹配跳过。例如主串为:abcababca子串为:abcabx这是一个很简单的例子,我们会从第一个开始比较,一直到前五个“abcab”都能匹配成功,但是最后的“x”匹配失败原创 2020-05-31 17:48:23 · 156 阅读 · 0 评论 -
三十天挑战数据结构(7)串的基本操作与简单匹配
忙完实验又两天,继续学习数据结构。今天先学串的基本操作,最基础的有:获取长度,复制,连接,打印,简单匹配。前面几个不用多说,就说说简单匹配吧。简单匹配是相对于KMP算法而言的,简言之就是从子串的第一个字符开始和主串标记位开始的每一个字符进行对比,如果不完全匹配就将子串移到主串的下一个位置。这个算法思路清晰,实现容易,但是很容易在遇到极端问题时浪费大量的时间,比如在主串最后才完成匹配这种情况,效率并不是很高。因此就有了KMP算法,可以更加高效地实现字符串的匹配。于是我准备单独拿一篇博客来写KMP算法原创 2020-05-29 12:09:15 · 155 阅读 · 0 评论 -
三十天挑战数据结构(6)循环队列的实现
在学习了栈这种先进后出(First in last out,也称FILO)的数据结构之后,我们来学习这种先进先出(First in first out,也称FIFO)的数据结构。循环队列的储存结构相对链式队列要简单一些,是直接事先分配好一块空间,在有限的空间内进行数据的操作。起初队头指针和队尾指针都指向0位置,为了区别队列满状态,将队列中只剩一个空间时看做满状态。队列满状态如下图:具体代码实现:(由于比较简单就不一块一块列了,直接贴代码,注释也比较详细)#include<stdio.h&g原创 2020-05-25 22:28:19 · 134 阅读 · 0 评论 -
三十天挑战数据结构(5)栈的链式储存结构
在还未料到可能可以系统化按顺序进行数据结构学习时,我就已经将我最最不熟的栈,先给处理了。详见三十天挑战数据结构(1)栈的实现和操作今天看着书发现它还有一种链式表示方法,感觉和单链表有些相似,不妨也来试试,只针对其最最基础的创建和进栈出栈做点文章。链式栈结构体://定义链式栈结构体typedef struct StackNode{ ElemType data; struct StackNode *next;}StackNode, *LinkStackPtr;typedef str原创 2020-05-24 14:55:41 · 164 阅读 · 0 评论 -
三十天挑战数据结构(3)线性表的顺序存储结构——创建、获取、插入、删除与打印
时隔两天的更新,和ddl打的不可开交。好不容易有点时间了,接着我们的数据结构挑战!既然要学,就从头开始学。既然C语言基础不扎实,就从最简单的开始补。前两期为了当时所需,出现的比较突然,这之后估计会挨着系统化的做出代码总结和学习了!!于是我们今天来实现最简单的数据结构——线性表的顺序储存结构。线性表的顺序储存结构图示:毕竟是最简单的数据结构,就不详述它了,直接贴代码,其中注释很详细。一共实现了:顺序表的初始化、建立、获取元素、插入元素和删除元素的基本操作。#include<stdio原创 2020-05-23 00:58:55 · 478 阅读 · 0 评论 -
三十天挑战数据结构(4)线性表的链式储存结构——创建、获取、插入、删除与打印
线性表分为顺序表和链表,其中顺序表就是分配一块空间,将数据按顺序排列,如果需要处理数据,删除或者插入,都会造成其它数据的位置变化,十分不方便且费事。因此我们引出了链表,不要求每个数据一定要按顺序存放,而是记住他们相邻的数据(位置),从而达到数据的储存效果。链式表的存储结构图示:线性表储存结构:typedef struct Node{ ElemType data; struct Node *next;}Node, *LinkList;建立单链表(头插法与尾插法)://建立单链原创 2020-05-23 15:59:25 · 376 阅读 · 0 评论 -
三十天挑战数据结构(2)层序建立二叉树、先序输出
先序中序后序建立二叉树都并不难,但是层序反而需要动点脑子,例如对于二叉树:这样一棵二叉树的层序遍历结果是:1-2-3-4-null-5-null-6-7-null-8而利用以上的层序遍历结果作为输入,先序输出为:1-2-4-6-7-3-5-8(忽略了null)这种层序遍历输入创建二叉树最开始是在某位博主的文章里学到的(忘了具体是哪位,55…),他的代码的一些指针啊数组啊就没有变动了,但这个博客主要是为了学习,所以事先在此声明一下,侵删。层序遍历先序输出源代码:#include<stdi原创 2020-05-19 01:38:13 · 336 阅读 · 0 评论 -
三十天挑战数据结构(1)栈的实现和操作
先三两句说一下我的状况:大二计算机系学生,大一学了一年基础物理数学,大二上才开始接触计算机程序语言相关知识。高中没搞过信息技术竞赛,没有学过任何少儿编程课…总而言之就是一个零基础小白 -_-开始专业课的学习之后一切看似十分正常,没想到关键时刻网课来临,没有老师线下指导、早八习惯性没有效率(懒…),再加上大一上C语言程序与设计老师水了一个学期其实并没有学到啥,造成了半个学期过去了,我的数据结构这门课菜的就像一锅汤…但是毕竟它是重点,我深深的知道。不能逃避,只有勇敢地去面对。虽然链表二叉树图没一个学原创 2020-05-18 21:15:15 · 173 阅读 · 0 评论