- 博客(44)
- 收藏
- 关注
原创 数据结构二叉树--堆(数据结构实现和堆排序的一种实现)
我们可以这样做:用一个指针从左到右依次扫描数组,向上调整算法的使用前提是本身为堆,那我们从下标为1的元素开始,扫描到一个相当于插入了一个,然后用向上调整算法调整为堆,再扫描下一个+调整,扫描完最后一个元素为止。那么这个数组就是一个堆了,如果我们想升序排列,则整理为大堆,先找最大的数据放在最后,如果想降序排列就先找最小的,也就是小堆。这是堆的基本操作,我们如果有一个数组,想借助堆这个数据结构利用额外的空间来实现排序,那么先依次将数据放入堆中,再依次删除并将删除的数据放入到数组中完成排序。
2024-01-15 22:31:41 678
原创 数据结构复习之链表
链表带环问题:让一个指针一次走一步,一个指针一次走两步,若可以遇上则带环,假设慢指针进环的时候,快指针和慢指针相差n个节点,快指针去追赶慢指针,每走一次都会-1,n-1、n-2、n-3最后到0,因此有环一定能追上(但让一个指针一次走一步,一个指针一次走三步就不一定了,看n的奇偶性,可能减不到0)。这是最简单的不带头结点的单链表,也是算法题目中使用最多的一个链表的形式,还有最复杂的带头结点的双向循环链表,插入删除同样是找到前一个节点,只是找的方式更多种多样了,并且要注意删除后的处理。声明好我们的链表节点。
2023-12-04 09:52:34 369
原创 数据结构之顺序表
程序开始,首先定义数据元素,重命名为elemtype,这样不论是结构体还是原子类型的数据类型都可以用它来表示,程序更容易读懂,然后开始创建顺序表,如果是静态实现,则结构体中有一个数据元素类型的数组以及一个num变量用来记录目前存入了多少个数据元素,然后在主函数中创建这个结构体就等于创建完了这个数据结构。第二种,若不额外开创空间,我们需要保证有一个数组的空间是足够装开这两个数组的,然后从最后开始填充,先找最大的放到最后,直至有一个数组遍历到头,然后将另一个数组中的元素依次挪进去即可。
2023-10-18 21:13:28 381
原创 对循环语句的理解
1、用getchar清空缓冲区,并将读到的字符打印出来:首先我们知道我们从键盘输入进电脑的东西首先放在缓冲区,再由getchar一个一个字符去拿,比如我们输入了asdf\n,首先读取a,打印a,读取s打印s,读取d打印d,读取f,打印f,读取\n,打印换行,这就是循环体,读取+打印,那么终止条件是什么?是getchar返回值为EOF为止,即输入ctrl+z,因此条件判断部分就是判断getchar的返回值,while((ch = getchar())!
2023-08-21 13:58:35 45
原创 c语言复习(总体简单复习及选择语句循环语句精复习)的感受,以及对scanf和getchar和内存缓冲区的重要理解
先进循环执行一次后再进行条件判断再执行,根据实际情况来挑选这三种语句,平时我们写目录的时候会用到do while,因为我们首先要展示菜单,然后让用户选择,根据选择进入switch语句,当然也可以写成while循环,只不过要在while循环外先展示一下菜单并让用户输入选择,根据实际情况与自己的需求合理灵活运用选择语句与循环语句,一定要灵活。这里面基本没有难点,有一个地方是悬空的else,若不加大括号,else始终只与离它最近的if相匹配,不论写成什么样子的格式都是如此。
2023-08-15 01:41:31 37
原创 递归在链式二叉树中的应用
链式二叉树,可能会有疑问,之前的顺序表、链表、栈、队列都是增删查改,二叉树这个数据结构中为什么没有这些基础操作,是因为二叉树非常复杂,目前这个阶段的增删查改没有意义,首先在链式存储的二叉树中学会控制递归结构,为后面的二叉树的应用打基础,链式二叉树-》搜索树-》AVL树-》B树系列,因此二叉树的学习很复杂,在搜索树部分会有增删查改,这个阶段首先就要打基础,熟悉递归的应用。在二叉树中使用递归前我们先搞清楚,是将递归(分治算法)应用于解决二叉树的问题中去,这是一种比较正确的理解。
2023-06-03 22:52:47 49
原创 二叉树的应用之一---堆
堆排序:首先有一个大小为n的数组,如何排序?删除堆顶最有用,能找出小堆中最小的数据和大堆中最大的元素,也就是找出一个数组中最大或最小的数据,这时候就能稍微体现出堆的用处了,一定会应用于排序中,但是现在如何删除呢?size此时指向的是最后一个数据的后一个位置,我们首先要将首元素和尾部的元素交换,然后删除即可,删除后我们得到的是一个没有堆顶的堆,父亲和兄弟之间的关系没有变,也就是左子树和右子树都是堆,这就是我们向下调整算法使用前的条件,向下调整算法是为了将堆顶的这个数据调整到合适位置,使整体成为一个堆。
2023-05-26 21:03:51 53
原创 栈和队列的实现
栈:只允许从一端删除、插入元素,这就决定了栈这个数据结构的实现用顺序表很合适,也决定了栈先进后出的特点FILO,栈的实现可以通过顺序表实现,也可以通过链表实现,因为栈只需要在栈顶删除插入元素,因此我们用顺序表即可,这样可以大大体现出顺序表的存储密度高、CPU高速缓存命中率高的特点,缺点是当空间不够的时候需要扩容,栈的应用可以应用于迷宫、网页返回上一页、括号匹配问题、二进制求值、递归(递归转非递归)、表达式求值(得到逆波兰表达式并计算,得到波兰表达式并计算等等)。
2023-05-16 15:16:22 45
原创 链表的实现
不带头单链表:创建一个结构体,每个结点都是一个结构体,因为每个节点中包含有不同的数据类型,当一个结点中包含有不同的数据类型的时候就要用到结构体,比如我们在静态线性表中要有一个数据域(数组)和top以及max,当我们的数组中每个单元中存放好几种数据类型时,要创建一个结构体再命名为Elemtype,typedef int Elemtype,这就是一种不用结构体的数据域,这都是为了简化线性表,使之看起来清晰,只包括数据域和另外两个变量,数据域中包含的什么类型的数据就在Elemtype这个结构体类型中找。
2023-05-16 14:40:05 70
原创 文件操作(1)
w”只写,把内存中的数据写到文件中,若我们给fopen函数的文件名不存在,若文件不存在,那么会自动创建一个文件;文件如何使用程序来打开?首先我们来了解一个概念——文件指针,每个被使用的文件都会在内存中产生一个相对应的文件信息区,用来存放文件的相关信息(比如文件的名字、状态、位置等等),相关信息在不同的操作系统上都是不同的,这些信息被保存在一个结构体变量中,该结构体类型被重命名为FILE,因此我们需要在程序中创建一个文件指针来找到我们要打开的文件,即这个指针变量中存放的是存放文件信息区的地址。
2023-03-31 22:18:21 94
原创 c语言基础--结构
结构内成员的访问分为两种,一种是结构体变量访问成员,这里用到.这个操作符,一种是结构体指针访问指向变量的成员,这里通过*(p).(成员名)访问比较啰嗦,我们可以通过指针名->成员名,这种方式来访问结构体比较快捷,在我们希望将结构传入到函数中使用时,我们最好传地址,因为结构体过大,函数压栈的系统开销比较大,效率低,传地址进函数既可以修改结构体中的成员中的值,也可以提升效率。这是c语言基础中的最后一节,后面都是进阶的内容,结构这部分也比较容易理解,分为声明、定义、初始化、成员访问、传参这几部分来讲解。
2023-02-01 22:00:50 41
原创 c语言基础--指针
我们在之前的介绍中融入了不少关于指针的知识点,因此现在对于指针已经有一定的了解了,首先我们来介绍一下什么是指针:要想了解指针我们首先要了解内存,32位的机器有32根线来管理内存,每根线在寻址的时候产生高电压和低电压,也就是一共2的32次方种不同的地址,一个地址管理一个内存单元,一个内存单元有一字节,也就是32位的机器可以管理4gb的内存空间,64位的机器可以管理8gb的内存空间。指针数组:这是一个数组,里面存放的是地址,我们可以用指针数组来管理多个一维数组,以此来模拟一个二维数组的效果。
2023-02-01 21:49:17 31
原创 c语言基础--操作符详解
我们先介绍一下补码,计算机中1表示负数,0表示正数,整数包括正数和负数,正数的原码、反码和补码完全相同,若数字为负数,则得到原码后除最高位(符号位)外其他位取反得到反码,反码+1得到补码,数据都是以补码的形式存储在内存中的,但打印出来的时候还是以原码的形式打印出来的,补码转换为原码的方式也很简单,也是取反加一即可转回原码形式。逻辑操作符:&&、||这两个操作符可以控制求值顺序,例如&&操作符,若左边为假,右边不会参与计算,整个表达式的值为假,若左边为真,才会计算右边的表达式。关系操作符:>=
2023-01-30 12:38:30 79
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人