
数据结构——C语言基础版
文章平均质量分 95
数据结构
迟来的grown
在校大学生分享学习日常
展开
-
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
接上篇,排序算法除了选择排序(希尔排序)和插入排序(堆排序)之外,还用交换排序(冒泡排序、快速排序)和归并排序已经非比较排序,本篇来深层解析这些排序算法。原创 2024-07-30 20:48:34 · 2065 阅读 · 49 评论 -
【排序算法(一)】——插入排序,选择排序 —> 深层解析
排序。原创 2024-07-30 20:48:31 · 1365 阅读 · 40 评论 -
【二叉树】—— 算法题
利用二叉树的递归思想,判断每一个节点值与其左右子节点的值是否相等,如果遇到空节点,就返回true(说明每一个节点值都相等);如果该节点的值与其左右子节点的值都相等,就接着递归该节点的左右子树。这里首先求二叉树的节点个数;利用相同的树的方法,判断二叉树根节点的左右子树是否对称(判断对称直接判断一个节点的左子树和另一个节点的右子树是否相等即可)。遍历到节点都不为空,且值相等,继续遍历 (这因为3的左右节点都为空,就一步带过)遍历结束,没有遇到一个节点为空一个节点不为空或者值不相等的情况,就返回true。原创 2024-07-28 21:52:15 · 1032 阅读 · 22 评论 -
【数据结构】二叉树链式结构——感受递归的暴力美学
查找相对来说就比较简单了,遍历二叉树,为空就返回NULL,值为x就返回该节点的地址,如果遍历过程中函数返回值不为NULL,就证明找到了,直接返回即可。访问4这个节点的右子树,也为空,此时节4这个点为根节点的左子树已经访问 结束了,回退到其父节点的函数栈帧,访问其父节点的右子树。这里,3这个节点的左右节点都为空,访问就直接返回,回退到根节点,就说明根节点的右子树访问已经结束,此时二叉树已经变了结束。再访问根节点5的左子树。遍历二叉树,遍历到空节点就返回0,不是空节点就返回其左子树和右子树节点个数之和再加一。原创 2024-07-26 23:23:03 · 962 阅读 · 44 评论 -
【数据结构】二叉树——顺序结构——堆及其实现
树是一种非线性的数据结构,它是由n(n>=0)个有限节点组成的一个具有层次关系的集合。除根节点外,其余部分被分为M(M>0)个互不相交的集合T1、T2、.....Tm,其中的每一个集合 Ti(1 <= i <= m)又是一颗结构与数类似的子树。每一颗子树的根节点都有且只有一个前驱节点,而可以有0个或者多个后继节点。树是递归定义的。在树形结构中,子树之间不能存在交集子树中存在交集,就不是树形结构了除了根节点以外,每一个节点有且只有一个父节点如图,E节点存在两个父节点,该图不是树形结构。原创 2024-07-23 23:38:55 · 1513 阅读 · 42 评论 -
【栈和队列】算法题 ---- 力扣
假设依次插入了1,2,3三个数据,现在要出栈将q1中数据size-1(2个)导入到q2中。现在q1当中剩余的数据就是要出栈的数据(即栈顶)。这样就满足了栈先进先出的特点。原创 2024-07-21 22:08:56 · 2295 阅读 · 43 评论 -
【数据结构】--- 栈和队列
前面学习了数据结构的顺序表、单链表、双向循环链表这些结构;现在就来学习栈和队列,这里可以简单的说栈和队列是具有特殊化的线性表。原创 2024-07-18 20:07:27 · 1508 阅读 · 31 评论 -
【链表】算法题(二) ----- 力扣/牛客
遍历链表,fast每次向前走两步,slow每次向前走一步,如果链表存在环,fast与slow指针一定会相遇;再定义两个指针从相遇节点和链表头结点开始遍历,两个指针相遇时的节点就是链表环的起始节点。先在原链表的基础上创建节点,形成新的链表,再给链表节点的random指针赋值,最后断开新链表和原链表的连接即可。找到链表的中间节点,然后逆置链表的后半部分,再一一遍历链表的前半部分和后半部分,判断是是否为回文结构。判断两个链表是否相交,如果相交就返回相交节点,如果链表不相交,那就返回NULL;原创 2024-07-16 18:04:08 · 1202 阅读 · 34 评论 -
【链表】算法题(一) ----- 力扣 / 牛客
看到这个题,本人一开始的想法是:遍历一遍链表,记录链表的节点个数,然后再遍历一次链表,寻找链表的中间节点;合并两个有序链表,这里创建一个新的链表,将两个链表中较小小的数据依次尾插到新链表中,最后返回新链表的头节点即可。题目上这样说,我们就可以创建一个新的链表,将值不为val的节点,尾插到新的链表当中,最后返回新链表的头节点。到这里,l2已经遍历到了NULL,循环结束,此时l1指向的就是反转后链表的头节点,直接返回即可。循环到这里,fast为空,循环结束,此时slow指向的节点就是链表的中间节点。原创 2024-07-14 21:53:27 · 1350 阅读 · 21 评论 -
【顺序表】算法题 --- 力扣
这个题让我们移除数组nums中值为val的元素,最后返回k(不是val的元素个数)这样显然我们就不能再创建一个数组来解决这个问题了,只能另辟蹊径思路:双指针这里定义两个指针(l1,l2)(l1,l2是整数,通过下标访问数组元素)都指向数组的起始位置,然后循环判断l1指向的元素是否等于val?如果等于,就让l2++;如果不等于,那就将l2的值赋给l1指向的元素,然后l1++,l2++。这样遍历完数组后,l1的值就是不等于val的元素的个数。原创 2024-07-12 21:22:38 · 1017 阅读 · 7 评论 -
【数据结构与算法基础】——算法复杂度
算法就是定义良好的计算过程,它取一个活一组的值输入,并产生出一个或一组值作为输出。简单来说,算法就是一系列的计算步骤,用来将输入数据转化成输出结果。原创 2024-07-10 11:15:36 · 969 阅读 · 2 评论 -
【数据结构】——双向链表详细理解和实现
双向链表是一种带头双向循环的链表。在双向链表中,首先存在着一个头结点;其次每个节点有指向下一个节点的指针next 和指向上一个节点的指针prev;最后,双向链表的头结点中存放上一个节点的指针指向链表的尾节点,尾节点中存放下一个节点的指针指向链表的头结点,形成一个闭环。这样双向链表既可以从前遍历,也可以从后遍历,直到回到起点。一、链表的分类链表的结构多种多样,链表呢可以是带头(不带头)、双向(单向)、循环(不循环)的,我们之前实现的单链表其实就是不带头,单向,不循环的链表。而这些有什么区别呢?原创 2024-07-08 11:04:55 · 1649 阅读 · 5 评论 -
【数据结构】——单链表实现
链表和顺序表都是线性表的一种,但是顺序表在物理结构和逻辑结构上都是连续的,但链表在逻辑结构上是连续的,而在物理结构上不一定连续;来看以下图片来认识链表与顺序表的差别这里以动态顺序表为例,和链表中的单链表对比一下动态顺序表单链表这里就可以很清晰的看到顺序表的底层其实就是一个数组,数据的是连续存储的(顺序表物理结构连续);而链表它每一个数据都不是连续的(链表物理结构上不一定连续)。链表节点通过观察上图,我们会发现链表每一个节点都存放在数据和下一个节点的地址。原创 2024-07-05 18:14:21 · 1977 阅读 · 11 评论 -
顺序表实现--通讯录
不过这里需要注意的时:我们是基于顺序表来实现通讯录,我们需要通讯录的头文件,也需要用到顺序表的相关代码,两个头文件在使用时都会用到另一个头文件的东西,而头文件又不能相互包含,(这里在通讯录头文件Contact.h中只需声明顺序表结构体就可以了(不可以直接使用重命名后的结构体名)),顺序表实现的头文件直接包含Contact.h即可(因为会涉及到数据类型重命名和插入、查找数据等)。中,实现顺序表时,存储的是整形数据,那现在需要将用户信息存储起来,我们就让顺序表存储的数据是我们结构体(联系人信息)。原创 2024-07-02 16:30:52 · 1198 阅读 · 9 评论 -
【数据结构】——顺序表
当我们想要使⽤大量使⽤同⼀类型的数据时,通过⼿动定义⼤量的独立的变量对于程序来说,可读性非常差,我们可以借助数组这样的数据结构将⼤量的数据组织在⼀起,结构也可以理解为组织数据的方式。在使用完顺序表后,就要销毁顺序表,因为动态顺序表内存是动态开辟的,所以需要对动态内存进行释放,并将有效数据和空间容量个数置为0;到这里,顺序表的知识就完成了,学完这些,我们也要写顺序表的实践,就是通讯录——在下一篇进行实现。求数组的长度,求数组的有效数据个数,向下标为数据有效个数的位置插入数据(注意:这里是。原创 2024-06-30 22:11:50 · 6491 阅读 · 17 评论