【数据结构】栈 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。**进行数据插入和删除操作的一段称为栈顶,另一端称为栈底**。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
【数据结构】建堆的方式、堆排序以及TopK问题 我们知道,堆是二叉树的一种,二叉树的建立是借助结构体与数组完成的(通过在结构体中创建动态开辟的数组变量储存堆中的元素)。除了借助结构体外,有没有其他方式,直接建堆。总结: 经由上述可知,向下调整建堆的时间复杂度与向上调整建堆的时间复杂度相比,向下调整建堆所需时间更少,因此在没有结构体构造堆的情况下,选择向下调整直接建堆。
【数据结构】树的概念与堆的实现 树是一种非线性的数据结构,它是由n(n>0)个有限节点组成一个具有层次关系的集合。把它叫做树是因为它看起来像是一颗倒挂的树,也就是说它是根朝上,而叶朝下的。树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,既要保持值域,也要保存节点和节点的关系,实际中树有很多种表示方式如:双亲表示法、孩子表示法、孩子双亲表示法以及孩子兄弟表示法等。这里着重介绍最常用的孩子兄弟表示法(左孩子右兄弟)。一颗二叉树是节点的一个有限集合,该集合:1.或者为空2.或者由一个节点加上两颗分别被称为左子树和右子树的二叉树组成
【数据结构】顺序表的概念及实现 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采取数组存储。在数组上完成数据的增删查改。顺序表一般可分为:1.静态顺序表:使用定长数组存储元素。2.动态顺序表
【数据结构】带头双向循环链表的实现 1. 双向循环链表有一个头节点,这个头节点不存储数据,只起到标记头部的位置。2. 链表中某一节点的指针域分为两部分,一部分储存下一节点的地址,另一部分储存上一节点的地址。3. 通过指针域,链表的头节点与尾节点相连,形成循环。...
【数据结构】链表-增删查改 链表是一种物理结构上非连续、非顺序的存储结构,数据元素的逻辑是通过链表中的指针链接次序实现的。链表创建完成后不需要初始化,链表过于简单,就是由一个个的结构体通过指针域串起来的,在不存储数据的时候,可以没有任何节点,即没有结构体,在主函数中将指向结构体的指针置为空就行了。......
牛客网刷题1【最小步数Fibonacci数列】 因此,Fibonacci数列就形如0,1,1,2,3,5,8,13,…,在Fibonacci数列中的数我们称为Fibonacci数。给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1,现在给你一个数N求最少需要多少步可以变为Fibonacci数。...
动态内存管理2之柔性数组 c99中,结构体中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员。图示第一种方式是用柔性数组的方式,第二种方式没有用柔性数组,但是最终达到的效果都是一样的,为什么还有柔性数组这种东西。上述代码没有用到柔性数组,柔性数组与之相比,柔性数组的优点在哪?...
长篇详解C语言动态内存管理 数组在声明的时候,必须指定数组的长度,它所需要的内存在编译时分配。但是对于空间的需求,不仅仅是上述的情况。有时候我们需要的空间大小在程序运行的时候才能知道,那数组的编译时开辟空间的方式就不能满足了。这时候就只能试试动态内存开辟了。malloc函数是动态内存开辟函数。动态内存开辟的空间在使用完毕以后,一定要释放,free函数就是释放函数。...
C语言实现通讯录 通讯录中储存了一个人的姓名、年龄、性别、电话号码、居住地址等信息。通讯录可以对一个人的信息进行添加、删除、查找、修改等操作。也可以对多人的信息按某条件(如年龄、姓名)进行排序操作。......
字符串函数和内存操作函数 1.创建实现某种功能的函数时,先分析需求,再一步步去实现需求2. 为了提高代码的可执行性和可靠性,函数参数的设置要具有包容性,同时根据需求,确定函数的返回值类型;有时为了保证指针参数所指向的内容不变,要用const修饰参数;函数内部用断言函数assert避免传过来的是空指针,断言函数不仅仅可以用来避免空指针,其可以避免自己想避免的其他东西。...
C语言实现基础版扫雷 如上所示是一个九成九的初阶版扫雷棋盘,棋盘上八十一个格子共有十处埋有地雷。当在(x,y)处有地雷,玩家被炸死,游戏结束,(x,y)处没有地雷,(x,y)处会显示其周围八个坐标雷的信息,假设周围八处共有三处埋有地雷,则在(x,y)处显示3。...
C语言实现三子棋 本文利用循环语句、判断语句、各种自定义函数以及不同功能的库函数实现了实现了简单三子棋游戏。函数实现放在一个.c文件中,库函数头文件以及自定义函数声明放在一个.h文件,主函数单独放在一个.c文件中。这种分文件化的书写形式对代码的维护与修改起到了便利作用。...