![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言
路漫漫其远,吾求索
晓看天色暮看云
展开
-
排序算法稳定性与不稳定性的理解
之前面试的时候,被问到过,选择排序稳定还是不稳定,当时随口说的稳定,然后他问我原因,我这就回答不上来了,事后去百度了一下,稳定的排序算法:就是能保证排序前两个相等的数在其序列的前后位置顺序与排序后它们两个数在序列的前后位置保持不变,比如a = b ,排序前a在b的前面,排序后a还是在b的前面。不稳定的排序算法:两个相等的数排序前后位置顺序发生改变,比如a = b,排序前a在b的前面,排序后b在a的前面稳定性的好处:排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果原创 2021-10-22 17:52:16 · 1821 阅读 · 0 评论 -
C语言标准库函数大全(ctype、time 、stdio、stdlib、math、string)
一. <ctype.h>二. <math.h>三. <stdio.h>四. <stdlib.h>五. <time.h>六. <string.h>原创 2021-10-22 09:52:23 · 1187 阅读 · 0 评论 -
HashMap底层实现原理
1,hashmap的数据结构数组:查询速度快,可以根据索引查询;但插入和删除比较困难;链表:查询速度慢,需要遍历整个链表,但插入和删除操作比较容易。hashmap是数组和链表组成的,数据结构中又叫“链表散列”。数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作原创 2021-09-26 18:02:50 · 106 阅读 · 0 评论 -
获取线程ID两种方法
一:gettid()函数gettid 获取的是内核中线程ID,而pthread_self 是posix描述的线程ID。二:直接调用pthread_self()求父子主进程和其所属进程 id#include<stdio.h>#include<pthread.h>#include<unistd.h>//由于pthread用户库内没有gettid()所以需要这个头文件以及下面的函数定义#include<sys/syscall.h>pid_t ge原创 2021-09-22 10:35:28 · 7477 阅读 · 0 评论 -
Inotify检测监听机制
描述:Inotify API用于检测文件系统变化的机制。Inotify可用于检测单个文件,也可以检测整个目录。当检测的对象是一个目录的时候,目录本身和目录里的内容都会成为检测的对象。目的:当内核空间发生某种事件之后,可以立即通知到用户空间。方便用户做出具体的操作。Inotify API inotify_init(void)用于创建一个inotify的实例,然后返回inotify事件队列的文件描述符。 同样内核也提供了inotify_init1(int flags)接口函数,当flag等于0的时候,原创 2021-09-18 17:34:53 · 410 阅读 · 0 评论 -
c语言实现(HashMap)映射
1,头文件:myHashMap.h#ifndef MYHASHMAP_H_INCLUDED #define MYHASHMAP_H_INCLUDED #include "myList.h" #define DEFAULT_INITIAL_CAPACITY 16 #define DEFAULT_LOAD_FACTOR 0.75f typedef struct entry { void * key; void * value; } Entry;原创 2021-09-06 11:29:30 · 835 阅读 · 1 评论 -
经典排序算法
常见的排序方法大致可分为两类比较类排序:通过比较来决定元素间的相对次序,由于时间复杂度不能突破,因此也称非线性时间比较类排序非比较类排序:不能通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间算法复杂度一,冒泡排序核心思想:相邻两个元素比较,将较小的数字放到左侧,以此类推,这样最后那个元素就是最大的数算法描述:比较相邻的元素,如果第一个比第二个大,就交换它们两个,对每一对相邻元素作同样的工作,直到最后一对,这样最后面那个数就是最大的数,针对原创 2021-05-17 17:11:30 · 106 阅读 · 0 评论 -
结构体基本定义与使用
一:结构体定义形式二:结构体变量的定义三:结构体变量的初始化四:结构体变量获取键盘输入五:结构体变量间的赋值原创 2020-03-29 22:14:40 · 112 阅读 · 0 评论 -
sprintf 组包 sscanf解包
一:sprintf 组包void test01() { int year = 2019; int mon = 8; int day = 1; //需求:将2019 8 1组成 2019年8月1日 char buf[64]=""; int len = sprintf(buf,"%d年%d月%d日",year,mon,...原创 2020-03-28 21:34:15 · 241 阅读 · 1 评论 -
字符串操作函数(二)
一:atoi/ atol /atof 字符串转数值二:strtok 字符串切割void test09() { char data[]="hehe:heiehi#xixi:haha!lala:henhen?wuwu"; char *buf[16]={NULL}; int i=0; buf[i] = strtok(data,":#!?...原创 2020-03-27 21:40:41 · 125 阅读 · 0 评论 -
字符串操作函数(一)
一:strlen 字符串长度测量案例:二:strcpy 字符串拷贝函数char *myStrcpy(char *dst, char *src) { char *tmp = dst; // while(*dst++ = *src++); while(*src != '\0') { *dst = *src; ...原创 2020-03-25 23:22:50 · 105 阅读 · 0 评论 -
函数指针:
函数指针:本质是指针变量 保存的是函数的入口地址函数的入口地址:函数名函数指针的定义函数指针的应用:作为函数的参数 目的让函数具备不同的功能int my_add(int x,int y){return x+y;}int my_sub(int x,int y){return x-y;}//需求:定义一个函数 实现my_add和my_sub的功能int my_cal...原创 2020-03-24 21:45:14 · 105 阅读 · 0 评论 -
指针(二)
一;指针变量的类型int p;//定义中有效指针变量自身的类型:将变量名拖黑 剩下啥类型 指针变量自身就是啥类型指针变量指向的类型:将变量名和离他最近的一个一起拖黑 剩下啥类型 指针变量指向的类型就是啥类型指向。。。的类型 == 保存。。。类型变量的地址指针变量的跨度:由指针变量指向的类型大小决定指针变量+1个跨度指针变量的取值宽度:指针变量指向的类型决定void tes...原创 2020-03-23 21:39:10 · 116 阅读 · 0 评论 -
指针(一)
一:内存地址的概述系统给内存的每一个字节,分配一个编号,这个编号就是内存地址指针:就是内存的地址编号 指针就是地址 地址就是指针二:指针变量指针变量:本质是一个变量,只是这个变量不是存放普通的10 20数据 而是存放的内存的编号(地址/指针)在32位平台所有的地址都是4字节三:定义指针变量void test02(){//普通变量的空间int num = 10;print...原创 2020-03-22 20:51:25 · 111 阅读 · 0 评论 -
数组[]:
一:一维数组【1】数组的定义://定义数组前 必须明确 有几个元素 每个元素类型啥?//需求:定义一个数组 有10个元素 每个元素为int类型//数组定义步骤://1、数组名 与[]结合是数组 (与*结合是指针 与()是函数)//2、将元素的个数 放入[]中//3、用元素的类型 定义一个变量//4、从上往下 整体替换int arr[10];//数...原创 2020-03-18 21:05:31 · 170 阅读 · 0 评论 -
Makefile 的编写
今天学习一下Make file的编写,make工具是用于多文件的编译的汇编工具。好处在于,当使用make编译过一次程序后,会记录每一个文件的时间戳,当修改某些文件后,再次使用make工具编译时,他只会编译修改过时间戳的文件这样相比gcc *.c节省了大量的时间,另外,make可以有选择性的对指定的文件进行编译。make工具需要自己去写,一般文件的名称为Makefile**编写Makefile文...原创 2020-03-17 21:17:55 · 140 阅读 · 0 评论 -
标准IO相关函数
一: – fgets( )#include <stdio.h>char *fgets(char *s, int size, FILE *stream);功能:从文件中读取内容参数: s:保存读取到的内容 size:每次读取的最大个数 stream:文件指针返回值: 成功:读取的数据的首地址 失败:NULL 如果文件内容读取完...原创 2020-03-16 22:17:53 · 122 阅读 · 0 评论 -
双向链表:
双向链表1,双向链表节点2,具体操作(1)定义结点结构体 ```c typedef int data_t; //定义结点结构体 typedef struct node{ data_t data; //数据域 struct node *front; //保存上一个结点的地址 struct node *next; //保存下一个...原创 2020-03-15 21:25:23 · 101 阅读 · 0 评论 -
冒泡排序法
冒泡排序 相邻两两交换#include <stdio.h>void myInputIntArray(int arr[],int n);void myOutputIntArray(int arr[], int n);void mySortIntArray(int arr[], int n);int main(int argc, char const *argv[]){ ...原创 2020-03-14 20:10:14 · 128 阅读 · 0 评论 -
键盘获取字符串 大写变小写 小写变大写 其他保持不变
键盘获取一个字符串 将大写 变小写 小写 变大写 其他保持不变void test02(){char str[128]="";//获取键盘输入fgets(str,sizeof(str), stdin);//逐个元素 比较int i=0;while(str[i] != '\0'){if(str[i]>='a' && str[i]<='z'){st...原创 2020-03-14 20:04:39 · 422 阅读 · 0 评论 -
单向链表:
一:链表的定义链表节点的定义:二:静态链表#include <stdio.h> typedef struct stu { //数据域 int num; char name[32]; float score; //指针域 //next保存下一个节点的地址 编号 struct st...原创 2020-03-13 20:50:38 · 117 阅读 · 0 评论 -
C语言歌词解析
源码:请私聊。原创 2019-12-21 11:25:52 · 364 阅读 · 0 评论 -
逻辑运算符与位运算符
逻辑运算符1. && 逻辑与两个条件都为真,则结果为真if((a>b) && (a<c))if(b<a<c) //这种表达方式是错误的2. || 逻辑或两个条件至少有一个为真,则结果为真if((a>b) || (a<c))3. ! 逻辑非if(!(a>b)){}逻辑与: A &...原创 2020-03-12 20:44:57 · 941 阅读 · 0 评论