
C语言
文章平均质量分 75
c语言基础知识
W1024201
这个作者很懒,什么都没留下…
展开
-
多线程生产者消费者——分别使用条件变量、信号量实现
生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的。原创 2022-12-31 14:58:37 · 542 阅读 · 0 评论 -
【Linux进阶】系统调用之文件操作
文件描述符(file descriptor)就是内核为了高效管理这些已经被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符来实现。同时还规定系统刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误。...原创 2022-07-26 20:45:38 · 873 阅读 · 0 评论 -
【Linux进阶】进程之异常——孤儿进程与僵死进程
孤儿进程一个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1,也被称为守护进程)所收养,并由init进程对它们完成状态收集工作。僵死进程一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵死进程。...原创 2022-07-26 04:26:16 · 677 阅读 · 0 评论 -
【Linux进阶】进程之fork——进程复制
一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。...原创 2022-07-25 17:29:44 · 1695 阅读 · 0 评论 -
【C语言数据结构】链队列
目录前言一、链队列1.链队列头文件及函数声明2.初始化3.结点申请4.结点释放5.入队6.获取队头元素5.出栈6.清空与销毁1.清空2.销毁8.循环队列源文件及整体函数实现总结前言队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。链队列,实际本身是一个链表,但是因为链表...原创 2022-03-25 22:14:57 · 3272 阅读 · 0 评论 -
【C语言数据结构】循环队列
目录前言一、循环队列1.循环队列头文件及函数声明2.初始化3.入队4.获取队头元素5.出栈6.清空与销毁1.清空2.销毁8.循环队列源文件及整体函数实现总结前言队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。循环队列,实际本身是一个顺序表,但是因为顺序表进行删除非尾部...原创 2022-03-25 21:49:34 · 1915 阅读 · 0 评论 -
【C语言数据结构】栈(顺序栈+链栈)
目录文章目录前言一、顺序栈1.顺序栈头文件及函数声明2.初始化3.扩容4.入栈5.获取栈顶元素6.出栈7.清空与销毁1.清空2.销毁8.顺序栈源文件及整体函数实现二、链栈1.链栈头文件及函数声明2.初始化3.结点申请4.入栈5.获取栈顶元素6.出栈7.清空与销毁1.清空2.销毁8.顺序栈源文件及整体函数实现总结前言栈(stack)又名堆栈,它是一种运算受限的...原创 2022-03-25 16:14:00 · 2683 阅读 · 0 评论 -
【八大排序】快速排序
目录目录前言一、排序规则划分规则二、代码实现总结前言快速排序(Quicksort),是对冒泡排序算法的一种改进。快速排序算法通过多次比较和交换来实现排序。特点:数据越乱排序速度越快,越有序排序速度越慢。时间复杂度最好O(nlogn) 最坏情况O(n^2) 平均时间复杂度O(nlogn) 空间复杂度O(nlogn) 稳定性:不稳定一、排序规则将数组内第一个元素作为我们的基准值,然后以基准值进行划分,划分出两部分,小于基准值都在基准值左边,大于...原创 2022-03-24 23:06:59 · 153 阅读 · 0 评论 -
【字符串匹配】KMP算法
目录前言一、匹配逻辑失配情况1.前面匹配过的位置不存在重复串2.前面匹配过的位置存在重复串二、代码实现前言KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。kmp算法为bf算法的优化,原创 2022-03-24 18:21:08 · 335 阅读 · 0 评论 -
【字符串匹配】BF算法
目录前言一、算法逻辑二、代码实现总结前言BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法是一种蛮力算法。bf算法进行字符串完全的遍历,所以其的时间复杂度较大,为(O(n * m)),但逻辑简单,代码实现方便。一、算法逻辑主串和子串从原创 2022-03-24 16:54:07 · 2290 阅读 · 0 评论 -
【八大排序】堆排序
系列文章目录八大排序(一):直接插入排序八大排序(二):Shell排序八大排序(三):冒泡排序八大排序(四):选择排序八大排序(五):二路归并排序八大排序(六):基数排序目录系列文章目录文章目录前言1.概念提醒完全二叉树大顶堆(小顶堆)2.堆的数组表示及调整规则数组表示调整规则二、代码实现1. 调整函数2.从尾部向头部堆的调整总结前言堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。..原创 2022-03-20 22:25:05 · 464 阅读 · 0 评论 -
【八大排序】基数排序(桶排序)
目录前言一、排序规则二、代码实现总结前言基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。将所有值按照个位,十位,百位......原创 2022-03-17 20:24:47 · 259 阅读 · 0 评论 -
【八大排序】二路归并排序(非递归 + 递归)
目录前言两两融合规则二、代码实现1.非递归实现2.递归实现总结前言归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。这些子问题解决的方法都是类似的,解决掉这些小的问题之后,归并子问题的结果,就得到了“大”问题的解。时间复杂度:..原创 2022-03-17 12:03:55 · 8186 阅读 · 0 评论 -
【八大排序】选择排序
目录文章目录前言一、排序分析二、代码实现总结前言选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序与冒泡排序都是将数据交换至正确的位置上,但冒泡排序在每一趟排序中进行未知次数交换,而选择排序是找到目标值之后将其与正确位置的值进行...原创 2022-03-14 00:08:39 · 406 阅读 · 0 评论 -
【八大排序】冒泡排序
目录文章目录前言一、排序规则二、代码实现总结前言冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡...原创 2022-03-13 23:13:39 · 775 阅读 · 0 评论 -
【八大排序】Shell排序
目录前言一、分组规则二、代码实现总结前言本文将介绍八大排序之一,Shell排序,Shell排序实际为直接插入排序的优化,使其时间复杂度降低。“shell排序,又名希尔排序,被称作缩小增量排序,是1959年首次提出的。主要思想:假设待排序原素序列涵盖n个原素,取一个整数increment(小于n)作间隔,把所有的元素分为increment个子序列,全部距离是increment的元素,放在同一个子序列中,在每一个子序列中分别实施直接插入排序”,Shell排序的执行时间依赖于增量序..原创 2022-03-11 23:08:27 · 1278 阅读 · 0 评论 -
【八大排序】直接插入排序
目录前言一、过程分析二、代码实现总结前言直接插入排序(Straight Insertion Sort)是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。其基本思想为:将所有数据分为两部分,一部分认为是有序的,另一部分认为是无序的,依次从无序序列中取值,向有序序列中放,再次保证完全有序,直到将待排序序列中所有值取尽。稳定性: 没有跳跃交换 稳定时间复杂度: O( n ^ 2 ) ...原创 2022-03-11 21:40:58 · 375 阅读 · 0 评论 -
【C语言数据结构】双向循环链表
目录前言一、双向循环链表循环结构1.双向循环链表头文件及函数声明2.初始化1.结点构造2.初始化函数3.结点申请4.数据插入1.按位置插入2.尾插3.头插5.查找6.数据删除1.按位置删除2.按值删除3.尾删4.头删7.清空与销毁1.清空2.销毁8.双向循环链表源文件及整体函数实现总结前言这次我们将学习双向循环链表,首先了解双向链表和循环链表的定义和讲解。双向链表也叫双链...原创 2022-03-08 11:02:17 · 7058 阅读 · 0 评论 -
【C语言数据结构】单链表
系列文章目录C语言数据结构:线性表之单链表的实现讲解(带头结点+不带头结点)提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言链表是线性表的一种,与顺序表不同的是,其虽然在逻辑上相邻,但在实际的物理内存中不相邻。链表是一种物理储存单元上非连续、非顺序的储存结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中原创 2022-02-23 05:45:14 · 587 阅读 · 0 评论 -
【C语言数据结构】顺序表
C语言数据结构:线性表之顺序表的实现讲解(定长+不定长)文章目录系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言数据结构的初始,先进行线性表的学习。线性表:有唯一的头,唯一的尾,并且除了头部节点,其他结点都存在前驱,除了尾部节点,其他结点都存在后继。线性表分为两种类型:顺序表和链表这篇文章将进行顺序表的讲解及代码实现。顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的原创 2022-02-23 03:28:03 · 693 阅读 · 0 评论 -
C语言:预处理(宏定义及运算符)
预处理是C语言的一个重要功能,它由预处理程序负责完成。当对一个源文件进行编译时,系统将自动调用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。C语言提供多种预处理功能,主要处理#开始的预编译指令,如宏定义(#define)、文件包含 (#include)、条件编译(#ifdef)等。合理使用预处理功能编写的程序便于阅读、修改、移植和调试,也有 利于模块化程序设计。在这里,我们详细说一下宏定义(#define)#define指令#define定义了一个宏名标识符及一个字原创 2022-02-22 04:21:42 · 2122 阅读 · 0 评论 -
C语言:浮点数内存存储机制
我们可以很快速的理解整型数在计算机中的存储模式,这是因为整型以二进制形式直接存储于内存中,而对于进制转换,是我们在学习计算机之初就已有所了解。但是浮点数是一个困扰许多人的问题,因为其在内存中特殊的存储形式,使得不熟悉这种规则的人们无法理解,就比如下面的代码:#include <stdio.h>int main(){ int x = 0x41440000; float* fp = (float*)&x; printf("&x = %08x ,x = %d原创 2022-02-21 04:11:52 · 416 阅读 · 0 评论 -
C语言:魔方阵-全(图解+代码+结果输出)
魔方阵,古代又称"纵横图",是指组成元素为自然数1、2…n的平方的n×n的方阵,其中每个元素值都不相等,且每行、每列以及主、副对角线上各n个元素之和都相等。一、奇数阶阵(n = 2k + 1)奇数魔方阵的排列规律如下(此处以3阶阵为例):⑴将1放在第一行中间一列;⑵从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列);⑶如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,.原创 2021-12-27 02:38:52 · 18725 阅读 · 3 评论 -
数组指针与指针数组
在C语言数组和指针两节的学习中,在*与[ ]结合时,根据结合的先后顺序,可以分为数组指针和指针数组两种类型,在此讲述一下区别、分辨方式及详细内容两种类型形成的根本原因为,符号的结合顺序来产生不同的含义在此可以复习一下,C语言运算符优先级表在此用int (*p)[n](数组指针) 和 int* p[n](指针数组)举例:一、数组指针和指针数组的区别数组指针:数组指针可以理解为,数组的指针,即是一个指向数组的指针。并且这个指针指向数组的地址。指针数组:指针数组可以理解为,指针的数组,..原创 2021-10-31 04:40:29 · 308 阅读 · 0 评论 -
C语言数据类型的字节大小
做题时总遇见不同平台下的数据类型大小,总出错,在此总结一下16、32、64位平台下数据类型大小不同平台下数据类型大小 类型 16位平台 32位平台 64位平台 char 1字节 1字节 1字节 short 2字节 2字节 2字节 int 2字节 4字节 4字节 unsigned int 2字节 4字节 4字节 float 4字节 4字节 8字节 double 8原创 2021-10-18 13:58:20 · 1828 阅读 · 1 评论 -
随机数实现猜数字游戏
C语言实现猜数字游戏方法:使用随机数产生数字 1-100效果:1、在输入一个数字以后提示猜大或猜小 2、猜中后显示猜中,并返回猜的数字 3、记录玩家猜的次数 4、玩后选择是否继续玩代码实现:#include <stdio.h>#include <stdlib.h> //提供包含随机数种子的srand()和rand()函数#include <time.h> //提供时间,产生变...原创 2021-10-18 01:46:16 · 672 阅读 · 0 评论 -
C语言运算符优先级表
C语言运算符优先级表 优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [ ] 数组下标 数组名[常量表达式] 从左到右 () 圆括号 表达式/函数名(形参表) . 成员选择(对象) 对象.成员名 -> 成员选择(指针) 对象指针.成员名 2 - 负号运算符 - 表达式 从右到左 单目运算符 (类型) 强原创 2021-10-16 15:12:52 · 414 阅读 · 0 评论 -
C语言基础知识
一、什么是C语言C语言是一门面向过程、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。尽管C语言提供了许多低级处理的功能,但仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可在包括一些类似嵌入式处理器以及超级计算机等作业平台的许多计算机平台上进行编译。//第一个C语言程序#include <stdio.h>int main(){ printf(原创 2021-10-16 15:00:09 · 675 阅读 · 0 评论 -
简单进制转换(十、二、八、十六)
一、十进制向二进制转换以下以29的转换为例:1、短除法即用29除以2,商写在下面,余数写在商的右面将余数从下到上排列下来,即是所得二进制的值如上图所示,29转化为二进制的值为11101二、按权位赋值先写下部分二进制权重,而后从大到小,在可满足权位下标1128() 64() 32() 16() 8() 4() 2() 1() 0 0 0 1 ...原创 2021-10-02 16:20:36 · 2688 阅读 · 0 评论