数据结构速成系列——30天掌握数据结构
文章平均质量分 94
数据结构的重要性不言而喻,数据结构应该是每个计算机专业的人都需要掌握的。看书晦涩难懂,看视频进度太慢,那么本专栏绝对适合你。笔者在阅读了大量的书籍和文章之后,结合自己的观点,以纯C语言为实现,通过简单易懂的讲述、生动形象的图解,帮助大家学习。笔者想让大家明白:原来数据结构也没有那么难嘛!
.caixukun
人生如逆旅,我亦是行人。
展开
-
为什么要学习数据结构?
本来我是不打算写这篇文章的,问为什么要学本来就是一个很傻的问题,不过作为专栏的第一篇,我再三思考了一下, 觉得一上来就写知识点也不是一个好的选择。既然是第一篇文章,还是来聊一聊数据结构吧。什么是数据结构在学习数据结构之前,我们当然需要了解一下究竟什么是数据结构,否则你连自己在学什么都不知道, 岂不是一个笑话?数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们的关系和操作等...原创 2019-12-17 16:05:08 · 6939 阅读 · 16 评论 -
基本概念和术语
文章目录概要数据(data)数据元素(data element)数据项(data item)数据对象(data object)数据结构(data structure)逻辑结构的种类存储结构的种类数据类型和抽象数据类型抽象数据类型的形式定义抽象数据类型如何实现概要本篇文章将讲解数据结构的基本概念和术语,这种概念性的东西往往是催人入睡的,当然了,没有谁能把概念讲出花来,概念就是枯燥的。由于专栏的...原创 2019-12-17 18:00:02 · 2827 阅读 · 0 评论 -
算法分析
这篇文章目的是分析算法的复杂度问题,关于算法的定义、特性等等问题在这里不作讲解。如何度量算法效率我们知道,算法是解决复杂问题的思路,条条大路通罗马,对于一个复杂的问题,能够解决的算法也有很多种,对于有多种解决方案的情况,我们当然是想选择一种快速、有效的算法了。那么我们该如何知晓一个算法的效率呢?1、事后统计法该方法通过设计好的测试程序和数据,然后在计算机中运行,接着对运行时间进行比较,耗时...原创 2019-12-17 18:01:36 · 3752 阅读 · 2 评论 -
线性表的顺序实现
文章目录线性表的定义线性表的抽象数据类型定义线性表的顺序表示和实现元素存储位置的计算顺序表的实现本篇文章将讲解线性表。线性表的定义线性表是由n(n >= 0)个数据元素(结点)a1,a2,…,an组成的有限序列,其中数据元素的个数n定义为表的长度,当n = 0时称为空表。比如序列{a1,a2,…,ai-1,,ai,ai+1,an},其中元素a1被称为线性起点或起始结点,元素an被称为...原创 2019-12-18 16:43:21 · 2713 阅读 · 2 评论 -
线性表的链式实现(一)
文章目录链式存储的定义链式存储的相关概念单链表的定义单链表的初始化头插法尾插法单链表的遍历单链表的基本操作判断单链表是否为空单链表的销毁清空单链表求单链表表长单链表的查找查找指定位置的元素值查找指定元素值的位置单链表的插入单链表的删除源代码本篇文章将讲解线性表的链式实现。链式存储的定义通过前面的学习我们知道,顺序表中的元素内存地址连续,存取效率高,但是也有它的缺点,比如有空间限制,插入删除效...原创 2019-12-18 23:27:38 · 3051 阅读 · 3 评论 -
线性表的链式实现(二)
文章目录循环链表的定义合并两个循环链表双向链表的定义双向链表的基本操作双向链表的初始化头插法尾插法双向链表的插入双向链表的删除源代码:本篇文章将讲解线性表的链式实现。循环链表的定义上篇文章我们学习了单链表,并掌握了单链表的一些基本操作,本篇文章我们继续学习循环链表和双链表的内容。先来看看循环链表的定义:循环链表是一种头尾相连的链表,即表中最后一个结点的指针域不再为NULL,而是指向头结...原创 2019-12-19 15:22:12 · 2628 阅读 · 0 评论 -
栈的实现
文章目录栈的定义栈的抽象数据类型定义栈的顺序实现顺序栈的基本操作顺序栈的初始化判断顺序栈是否为空求顺序栈的长度清空顺序栈销毁顺序栈顺序栈的入栈顺序栈的出栈栈的链式实现本篇将讲述栈的相关知识在之前的文章中我们学习了线性表,大家一定要掌握线性表的相关知识,这是后面内容的基础。栈的定义先来看看栈的定义:栈是限定仅在表尾进行插入和删除操作的线性表。表尾一端被称为栈顶,相对地,把另一端称为栈底。...原创 2019-12-19 22:16:05 · 2538 阅读 · 2 评论 -
队列的实现
文章目录队列的定义队列的抽象数据类型定义队列的顺序实现顺序队列的基本操作入队出队普通顺序队列的缺陷循环队列循环顺序队列的基本操作顺序队列的初始化求顺序队列的长度顺序队列的入队操作顺序队列的出队操作取顺序队列的队头元素队列的链式实现链式队列的基本操作链式队列的初始化链式队列的销毁链式队列的入队操作链式队列的出队操作源代码顺序队列代码链式队列代码本篇文章将讲解队列。队列的定义队列是一种特殊的线...原创 2019-12-20 15:25:52 · 2636 阅读 · 0 评论 -
串结构解析
文章目录串串的定义串的相关概念串的抽象数据类型定义串的存储结构串的顺序存储结构串的链式存储结构串的基本操作串的模式匹配算法BF算法本篇将讲述串、数组和广义表的相关内容。串在前面,我们学习了线性表、栈和队列,接下来我们继续学习串、数组和广义表的相关内容。对于串,学过字符串的同学应该都不陌生,而C语言中没有字符串类型,是通过字符数组实现的,字符串的一些基本操作,比如分割字符串、求字符串长度等都...原创 2019-12-22 13:38:58 · 3246 阅读 · 0 评论 -
树和二叉树(一)
文章目录树的定义结点的定义树的其它概念二叉树的定义满二叉树完全二叉树二叉树的性质性质1性质2性质3性质4性质5二叉树的存储结构二叉树的顺序存储结构二叉树的链式存储结构本篇文章将讲解树和二叉树,因为树和二叉树涉及的内容较多,我将这些内容分为几篇文章来讲解。树的定义先看看树的官方定义:树是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来...原创 2019-12-30 15:56:55 · 3973 阅读 · 1 评论 -
树和二叉树(二)
文章目录二叉树的遍历算法先序遍历算法中序遍历算法后序遍历算法层次遍历算法非递归遍历算法上篇文章介绍了树和二叉树的定义以及遍历方式。本篇文章将讲解二叉树的算法实现。二叉树的遍历算法先序遍历算法先序遍历的实现方式在前面已经说过了,比如下面的一棵二叉树:我们需要先访问根结点A,然后以先序遍历的方式遍历左子树,左子树同样是一棵二叉树,以同样的方式访问根结点B,然后先序遍历B的左子树,会发现,...原创 2020-01-01 12:50:32 · 4719 阅读 · 2 评论 -
树和二叉树(三)
文章目录线索二叉树的由来如何利用二叉链表中的空指针域在前面的专栏文章中,我们学习了树和二叉树,重点学习了二叉树的性质和基本算法,本篇文章将讲述线索二叉树。线索二叉树的由来先来看下面这棵二叉树:这是二叉树存储结构中的二叉链表,其优点是能够很方便地找到任意结点的左右孩子,然而,它也有缺点:一般情况下,无法直接找到某个结点在某种遍历序列下的前驱结点和后继结点。为了能够方便地找到任意结点的前驱...原创 2020-01-26 13:58:21 · 3403 阅读 · 0 评论 -
哈夫曼树
文章目录举个栗子哈夫曼树的基本术语路径树的路径长度权结点的带权路径长度树的带权路径长度本篇文章将讲述哈夫曼树的相关内容。举个栗子既然要学哈夫曼树,我们就得知道什么是哈夫曼树,哈夫曼树的作用是什么。我以一个例子来告诉大家哈夫曼树的概念和作用。期末考试结束了,各个学校都在准备评定大家的考试成绩,现在有一个需求,将学生的百分制成绩转换为五分制成绩:90 ~ 100:A80 ~ 89:B7...原创 2020-01-29 12:00:46 · 2281 阅读 · 0 评论 -
图的基本知识
文章目录图的基本概念案例引入图的存储结构邻接矩阵无向图的邻接矩阵有向图的邻接矩阵前面花费了较多的篇幅介绍树和二叉树的相关知识,关于树和二叉树的内容也是较多考试中的重点难点,希望大家读了我的文章后能够快速掌握,这是我写本专栏的初衷。本篇文章将介绍图的基本知识。图的基本概念在前面我们学习了线性表、栈、队列、树,其中线性表、栈和队列属于线性结构,元素之间是一对一的关系;树属于树形结构,元素之间是...原创 2020-04-02 17:09:17 · 971 阅读 · 0 评论 -
【查找算法】顺序查找法
学到这里,相信大家对基本的数据结构都有了一定的认识,当然,我们还有一些数据结构没有讲解,比如:图、广义表、数组等。这些内容我都会在后续进行更新。不过这段时间,我主要还是先介绍一下查找和排序算法,在这些算法中如果涉及到还未介绍的数据结构,我就会对该数据结构进行介绍。本篇文章将介绍顺序查找算法。文章目录何为顺序查找?算法改进时间效率分析何为顺序查找?看到这个算法的名字不难理解,它是一种按...原创 2020-02-20 15:30:28 · 2581 阅读 · 0 评论 -
【查找算法】折半查找法
本篇文章将介绍折半查找算法。文章目录何为折半查找?算法实现递归实现效率分析何为折半查找?上一篇文章介绍了顺序查找算法,我们知道,虽然顺序查找算法适用性高,但效率太低,那么能不能在此基础上继续提高算法的效率呢?这个时候,折半查找诞生了,它的原理是每次都将待查找的记录所在的区间缩小一半,比如:若要在该序列中查找元素值4,折半查找是如何做到的呢?它需要先设置两个游标,一个指向最左边,一...原创 2020-02-20 17:08:09 · 2814 阅读 · 0 评论 -
【查找算法】二叉排序树查找法
本篇文章将介绍二叉排序树的查找算法。文章目录何为二叉排序树查找?查找算法实现查找效率分析二叉排序树的插入操作二叉排序树的生成操作二叉排序树的删除操作何为二叉排序树查找?上篇文章我们学习了折半查找,虽然折半查找算法将查找效率提高了,但是折半查找要求序列有序,所以当表插入、删除操作频繁的时候,为了维护表的有序性,就需要移动大量的元素,此时用折半查找显然事倍功半了。那么有没有一种办法能够让查...原创 2020-02-21 16:03:32 · 4517 阅读 · 0 评论 -
【查找算法】二叉排序树查找法(二)
上篇文章介绍了关于二叉排序树的查找算法,我们知道,二叉排序树虽然能够提高查找效率,并为频繁的插入、删除操作提供便利,但如果构建不当,即:构建出的二叉排序树不"平衡",也会大大降低查找效率。为此,我们需要将"不平衡"的二叉排序树进行"平衡化"处理。本篇文章将介绍平衡二叉树。文章目录何为平衡二叉树?如何进行"平衡化"处理LL型RR型LR型RL型何为平衡二叉树?先看定义:平衡二叉树又称...原创 2020-02-23 12:35:25 · 1870 阅读 · 1 评论 -
【查找算法】哈希查找法
本篇文章将介绍一种新的查找算法——哈希查找。文章目录何为哈希查找?散列表冲突构造散列函数直接定址法除留余数法解决冲突的方式开放地址法链地址法何为哈希查找?先看定义:哈希查找是通过计算数据元素的存储地址进行查找的一种方法。哈希查找通过给定的哈希函数构造哈希表(也叫散列表),然后通过计算存储地址进行元素查找。所以我们先来聊聊散列表。散列表散列是一种新的存储方式,它既不是按给定形...原创 2020-02-26 12:44:45 · 2202 阅读 · 0 评论 -
【排序算法】直接插入排序
本篇文章来聊一聊直接插入排序。基本思想直接插入排序的原理非常简单,即:每步将一个待排序的对象,按其关键码大小,插入到前面已经排好序的序列上,直到对象全部插入为止。典型的直接插入排序案例就是理扑克牌,你在抓牌的过程中就会对手上的扑克牌进行排序,找到每张牌需要插入的位置,然后进行插入。图解排序过程现有如下的一个序列(以从小到大排列为例):绿色部分是序列中的有序片段,我们从下标为4的位...原创 2020-03-29 14:43:31 · 893 阅读 · 0 评论 -
【排序算法】折半插入排序
本篇文章来聊一聊折半插入排序。基本思想先来回顾一下直接插入排序的算法思想,就是在前面已经排好序的子序列中寻找一个待插入的位置,然后将待插入元素插入到该位置上。其中寻找插入位置的过程我们是与每一个元素进行比较,相当于顺序查找,我们知道顺序查找的效率是比较低的,那么有没有办法能够提高查找插入位置的效率呢?很巧的是,前面的序列既然已经是有序的了,我们何不采用折半查找来找出插入位置呢?折半查找...原创 2020-03-29 15:41:48 · 1619 阅读 · 0 评论 -
【排序算法】希尔排序
本篇文章来聊一聊希尔排序。基本思想上篇文章我们学习了折半插入排序,该排序算法的原理是在顺序插入查找插入过程中使用折半查找法从而提高插入效率,为此,我们可以思考一下是否还有办法能够使插入的效率更高呢?基于此,希尔排序诞生了,希尔排序的基本思想为:先将整个待排序序列分割成若干子序列,分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行一次直接插入排序。图解排序过程...原创 2020-03-30 14:07:24 · 947 阅读 · 0 评论 -
【排序算法】冒泡排序
本篇文章来聊一聊冒泡排序,这种排序算法大家并不陌生,不管学什么语言,冒泡排序都是必须要掌握的,也是排序算法中的经典案例。基本思想冒泡排序的思想非常简单,每趟不断将记录两两比较,按规定顺序进行交换。比如有这样一个序列(这里以从小到大排列为例):首先,让21和25比较,21小于25,不做操作;再让25和49比较,25小于49,不做操作;接着让49和25比较,49比25打,将这两个元素...原创 2020-03-28 16:52:12 · 1417 阅读 · 0 评论 -
【排序算法】快速排序
本篇文章来聊一聊快速排序,快速排序其实非常简单,但仍有很多同学不能理解,究其原因,是大家没能真正体会排序的原理,如果你对快速排序还不太了解,那么这篇文章你绝对不能错过。基本思想先说说快速排序的基本思想:任取一个元素为中心将序列中所有比它小的元素放在其前面,比它大的元素放在其后面,从而形成两个子表对两个子表分别做快速排序,直至子表中仅剩一个元素图解排序过程理解了思想后,我们通过...原创 2020-03-28 14:11:30 · 954 阅读 · 0 评论