数据结构与算法
数据结构与算法总结C语言
lhh_qrsly
嵌入式领域软件和硬件知识分享
展开
-
phread 消息队列测试demo
这段代码创建了一个基于pthread实现的队列数据结构,在初始化时需要指定队列的最大长度MAX_QUEUE_SIZE,并通过QueueP_create函数进行初始化。队列中保存的每个元素是QueueP_NodeData_t类型的结构体。QueueP_get和QueueP_put函数分别用于获取队列中的元素和向队列中放入元素。在main函数中,我们创建了一个生产者线程和一个消费者线程,它们并发地对队列进行操作。生产者线程循环向队列中插入数据,而消费者线程从队列中读取数据。原创 2023-08-05 14:21:57 · 168 阅读 · 0 评论 -
二分查找算法
二分查找如果从文件中读取的记录关键字是有序排列的,则可以用一种效率更高的查找方法来实现,即二分查找基本思路每次都将关键字与中间的元素对比,如果不相等再判断关键字范围并移动上下限指针,继续折半比较#include <stdio.h>int binary_search(int key,int a[],int n) //自定义函数binary_search(){ int low,high,mid,count=0,count1=0; low=0; high=n-1;原创 2020-10-20 09:45:01 · 164 阅读 · 0 评论 -
冒泡排序思想
算法描述比较相邻的元素,如果前一个比后一个大,交换之。第一趟排序第1个和第2个一对,比较与交换,随后第2个和第3个一对比较交换,这样直到倒数第2个和最后1个,将最大的数移动到最后一位。第二趟将第二大的数移动至倒数第二位…因此需要n-1趟;动图实现,(来源参考资料)#include <stdio.h>#define NUM 5void arrsort(int[],int);void arrout(int[],int); main(){ int a[NUM]={16,25原创 2020-10-20 09:35:51 · 164 阅读 · 0 评论 -
什么是哈希表
哈希表是一种数据结构~基本概念哈希表可以存储各种类型的数据,当我们从哈希表中查找所需要的数据时,理想情况是不经过任何比较,一次存取便能得到所查记录,那就必须在记录的存储位置和它的关键字之间建立一个确定的对应关系 f,使每个关键字和结构中一个唯一的存储位置相对应。(关键字就是所要存储的数据,存储位置相当于数组的索引)当然,可以把哈希表理解为一个数组,每个索引对应一个存储位置,哈希表的索引并不像普通数组的索引那样,从0到length-1,而是由关键字(数据本身)通过哈希函数得到eg1. 将26个小写字母原创 2020-10-20 09:25:19 · 494 阅读 · 0 评论 -
时间复杂度/空间复杂度-O(1)、O(n)、O(n^2)、O(log n)、O(n log n)是什么意思
这些都是算法时空复杂度的表示。不仅仅用于表示时间复杂度,也用于表示空间复杂度。O后面的括号中有一个函数,指明某个算法的耗时/耗空间与数据增长量之间的关系。其中的n代表输入数据的量。O(1)解析O(1)就是最低的时空复杂度了,也就是耗时/耗空间与输入数据大小无关,无论输入数据增大多少倍,耗时/耗空间都不变。 哈希算法就是典型的O(1)时间复杂度,无论数据规模多大,都可以在一次计算后找到目标(不考虑冲突的话),冲突的话很麻烦的,指向的value会做二次hash到另外一快存储区域。通俗易懂的例子什么.翻译 2020-10-20 08:58:02 · 269 阅读 · 0 评论 -
函数的递归调用
前面讲了函数调用,那么函数到底是如何调用的?函数调用是通过栈实现的。在调用函数时,系统会将被调函数所需的程序空间安排在一个栈中。每当调用一个函数时,就在栈顶为它分配一个存储区。每当从一个函数退出时就释放它的存储区。也就是说,当前正在运行的函数的存储区是在栈顶的。因为栈是先进后出的(或者说是后进先出的),所以当有多个函数嵌套调用时,会按照先调用后返回的原则(或者说是后调用先返回的原则)进行返回。递归也是一种函数调用,只不过是函数自己调用自己,是一种特殊的函数调用,调用自己同调用别人是一模一样的。因为递归翻译 2020-10-19 13:19:55 · 604 阅读 · 0 评论 -
栈的操作
栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。自己理解的话,栈就像是砌墙,最先的砖在最下面,最后的砖在最上面。数据结构的课程学完顺序表,链表之后,就进入了栈和堆的学习。关于那些建立栈的模板代码相对晦涩难懂。 不如就用最简单的数据结翻译 2020-10-19 10:56:24 · 144 阅读 · 0 评论 -
循环链表的创建
循环链表的创建以及基本操作上篇我们讲了运用头插法和尾插法创建单链表的方法,和两种方法的比较。 接着我们学习循环链表的创建。只要学会了单链表的创建,循环链表的创建就变得很简单。循环链表创建单链表的结构:循环链表:所谓循环链表,就是将单链表的尾结点 end 的指针域 也就是 end->next 指向头结点的地址 : end->next = head 。 这样就完成了循环链表的创建。这就完了? 当然没有那么简单了~~~循环链表不同于单链表,原因在于上篇我们讲单链表的时候,尾结点指针域翻译 2020-10-19 02:23:04 · 4693 阅读 · 0 评论 -
单链表的头插法与尾插法详解
创建单链表关于数据结构的入门,就是从顺序表和单链表开始。我们不讲顺序表,直接从单链表开始我们的数据结构和算法的学习之路。单链表就是一种特殊的结构体组合而成的数据结构,关于单链表的创建方法有很多种,但都大同小异。正如这幅图中所表示的那样,单链表就是由可能不连续的数据所组合而成的数据结构。 其中每个数据分为两部分,一部分是数据存储的位置,称为数据域,另外指针所存储的地方,称为指针域。typedef struct Node { int data; // 存储链表翻译 2020-10-19 01:28:11 · 15269 阅读 · 2 评论 -
单链表的各种功能实现(C语言)
链表的分类及存储方式单链表双链表双向循环链表创建一个单链表//不是链表的结构体//链表中一个节点的结构体typedef struct SListNode { DataType data; // 值 struct SListNode *Next; // 指向下一个结点 } SListNode;链表要实现的功能// 初始化 ,构造一条空的链表void SListInit(SListNode **ppFirst);//打印链表void SListInit(SLis转载 2020-10-18 22:55:28 · 268 阅读 · 0 评论