【C语言学习】
轻飘风扬
有较强的团队合作精神,学习能力较强,善于学习新技术,为人乐观积极做事有耐心,能够在较强的压力下工作,有较强的适应能力,真诚温和,做事踏实,有较强的动手能力
展开
-
数据结构与算法学习--二叉树及二叉搜索树
可以看下以前对数的总结https://blog.csdn.net/sjin_1314/article/details/8507490下面是二叉树的遍历,创建及销毁的函数实现,层次遍历依赖队列;队列实现可以去github上查看https://github.com/jin13417/algo/tree/master/c-cpp/23_binarytree/tree/***************...原创 2018-11-14 11:56:12 · 828 阅读 · 1 评论 -
位运算操作相关
位操作 在压缩和解压数据时,常常需要在小于一个字节的数量级上 进行数据操作。因此,在讨论各种数据压缩方法之前,首先必须熟悉一些对数据位进行的操作。这些操作非常重要,因为C语言本身只有一小步等内在的、不可分割的操作数。下面是介绍一些位操作的基础,和参阅博客:位操作基础篇之位操作全面总结 下面是自己对博客内容简单的总结。 #include #include #i原创 2013-03-31 20:01:45 · 2115 阅读 · 0 评论 -
浅谈宏定义使用技巧
1、宏定义介绍 宏定义又称为宏替换,简称宏。它是在预处理阶段用预先定义的字符串替代标识符的过程。其定义的一般形式为: #define 标识符 字符串 宏定义中的标识符都采用大写,这是编程中一种约定俗成的习惯。在了解如何使用宏定义之前,我们先来了解使用宏的过程中需要注意的几个要点。 1)宏替换不做语法检查,所以在使用的时候要格外小心。原创 2013-03-17 17:44:11 · 4933 阅读 · 2 评论 -
关于栈的理解(读书笔记)
关于对栈的理解,相信很多人和我一样都是很模糊的。在昨天阅读数据的时候,看到对这方面的介绍,便写个这个博客来和大家分享下。希望对大家有所帮助。 栈,是硬件,主要作用表现为一种数据结构,是只能在一端插入和删除数据的特殊线性表。允许进行插入和删除操作的一端称为栈顶,另一端为栈底。栈按照后进先出的原则存储数据,最先进入的数据被压入栈底,最后进入的数据在栈顶,需要读数据时从栈顶开始弹出数据。栈底原创 2013-03-16 02:16:17 · 7873 阅读 · 1 评论 -
C语言中时间相关函数总结
在项目中总会设计到时间记录的问题,需要选择合适函数,获得相应的时间格式,特别在网上查找了一些关于这方面的资料,进行了总结。 C/C++中的日期和时间 头文件 time.h 函数用途 函数名 得到处理器时间 clock 得到时间差 difftime 设置时间 mktime 得到时间 time 得到以 ASCII码表示的时间原创 2013-03-28 22:22:09 · 10831 阅读 · 1 评论 -
走进结构体存储--位域
1、位域简介 在嵌入式编程中,经常会遇到下面的结构:struct _data{ char a:6; char b:2; char c:7;}data; 在存储信息的时候,我们可能并不需要占用一个完整的字节,而只需占一个或几个二进制位,如要存储一个八进制数据,只需要3 个二进制位就够了。为了节省存储空间,C 语言提供了位域这种数据结构。所谓原创 2013-03-17 10:52:22 · 5332 阅读 · 0 评论 -
C算法精解---图(Graph)
在计算机科学领域,图是最为灵活的数据结构之一。事实上,大多数的数据结构都能用图的形式表示,尽管按照这种方法表示它们通常会变得更加复杂。图是一种灵活的数据结构,描述一种模型用来定义对象之间的关联和联系。对象有顶点表示,对象之间的关系或关联则通过顶点的边来表示。 图的遍历方法: 深度优先搜索:(DFS:Depth First Search) 深度优先搜索在搜索过程中每当访问到某个顶点后原创 2013-02-23 22:36:23 · 9616 阅读 · 0 评论 -
浅谈数据的查找(二分查找)
二分查找 以下是百度百科上的介绍: 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关原创 2013-03-11 21:46:47 · 3864 阅读 · 1 评论 -
浅谈排序算法实现 (计数排序、基数排序)
1、 计数排序 计数排序是一种高效的线性排序,它通过计算一个集合中元素楚翔的次数来确定集合如何排列,计数排序不需要进行数据的比较,所有他的运行效率前面介绍的都高。 计数排序(Counting sort)是一种稳定的排序算法。计数排序使用一个额外的数组Count_arr,其中第i个元素是待排序数组Arr中值等于i的元素的个数。然后根据数组Count_arr来将Arr中原创 2013-03-09 23:39:30 · 7766 阅读 · 10 评论 -
浅谈排序算法实现 (归并排序)
归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个原创 2013-03-09 12:09:43 · 2257 阅读 · 0 评论 -
浅谈排序算法实现(冒泡、交换、插入、快速)
排序是指将元素集合按照规定的顺序排列,通常有2中方法,升序和降序排序。排序的目的就是是数据能够以更有意义的形式表现出来。虽然排序最显著的应用时排列数据以显示它,但它往往可以用来解决其他的问题,特别是作为成熟算法的一部分。 总的来说,排序的算法有2大类:比较排序和线性时间排序。比较排序依赖于比较和交换来讲元素移动到正确的位置上。令人惊讶的是,并不是所有的排序算法都依赖于比较。对于那些依赖于比较原创 2013-03-05 21:35:20 · 4221 阅读 · 2 评论 -
基于图(graph)的应用举例
1、统计网络跳数 图在解决许多与网络相关的问题时起到了重要的作用,统计在internet中从一个节点访问其他节点时中间必须经过的最小的节点数,这个消息在internet中非常有用,因为最明显的网络开销直接和所要的遍历的节点数目相关。 下面是采用BFS实现计算网络跳数,使用了前面提供的队列及链表的函数接口。在阅读中希望先把链表和队列的相关的函数接口了解下。 先了解下程序中几原创 2013-03-03 18:11:16 · 3885 阅读 · 0 评论 -
动态内存申请函数选择(realloc、malloc 、alloca、 calloc)
1、函数realloc 函数简介: 原型:extern void *realloc(void *mem_address, unsigned int newsize); 语法:指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。//新的大小一定要大于原来的大小,不然的话会导致数据丢失! 头文件:#include 有些编译器需要#in原创 2013-02-20 21:14:11 · 5805 阅读 · 0 评论 -
用 c 语言实现类的继承,并且可用父类指针操作子类对像的一个测试例子
/** * 用 c 语言实现类的继承,并且可用父类指针操作子类对像的一个测试例子 * * @Author: tomken.zhang * */#include #include #include // 定义一个动物类,有二个方法struct v_animal_ptr { const char* (*get_name)(); // 获取名字转载 2013-02-06 11:58:15 · 3064 阅读 · 0 评论 -
C算法精解---树的基础知识
数据结构中为了存储和查找的方便,用各种树结构来存储文件。树的应用相当广泛,在数据库系统、用户界面、表达式处理、人工智能、时间调度、优先级队列、赫夫曼编码等都有应用。下面就和大家一起来学习树。首先了解下树的一些概念、性质、二叉树的遍历及树分类。先看下面的导图吧 遍历二叉树 上面的导图对遍历二叉树的方法进行了划分。二叉树的先序、中序及后序遍历的算法一般是由递归来实现的。我们首先来看下原创 2013-01-15 22:56:40 · 3290 阅读 · 0 评论 -
递归函数
一、基本的递归函数 首先先来了解下C程序在内存中的组织方式,基本上来说一个可执行的程序在内存中有4个区域组成:代码段、静态数据区、堆与栈。代码段包含程序运行时所执行的机器指令;静态数据区是包含在程序的生命周期内的一直持续的数据,比如全局变量和静态的局部变量;堆包含程序运行过程中动态分配的存储空间。栈是函数调用过程中所使用的信息。 当C程序调用一个函数是栈会分配一个原创 2012-12-06 23:14:52 · 4086 阅读 · 5 评论 -
Linux中的system函数详细分析
system()函数功能强大,很多人用却对它的原理知之甚少,我想大家如果知道了system的具体实现就不会对楼主程序在很多编译器中不能表现自己希望的功能感到费解了。我对linux中的实现比较了解,具体分析这个,windows中的类似就不详解了。好了,先看linux版system函数的源码:#include #include #include #include i原创 2012-12-26 09:57:20 · 2547 阅读 · 1 评论 -
数据结构与算法学习--哈希
一、散列表的由来1.散列表来源于数组,它借助散列函数对数组这种数据结构进行扩展,利用的是数组支持按照下标随机访问元素的特性。2.需要存储在散列表中的数据我们称为键,将键转化为数组下标的方法称为散列函数,散列函数的计算结果称为散列值。3.将数据存储在散列值对应的数组下标位置。二、如何设计散列函数?总结3点设计散列函数的基本要求1.散列函数计算得到的散列值是一个非负整数。2.若key1=...原创 2018-11-08 22:03:23 · 954 阅读 · 0 评论 -
数据结构与算法学习--跳表
跳表Skip List是一种随机化的数据结构,基于并联的链表,其效率可比拟于二叉查找树(对于大多数操作需要O(log n)平均时间)。基本上,跳跃列表是对有序的链表增加上附加的前进链接,增加是以随机化的方式进行的,所以在列表中的查找可以快速的跳过部分列表(因此得名)。所有操作都以对数随机化的时间进行。Skip List可以很好解决有序链表查找特定值的困难。跳表的定义及如何构造跳表构造一个有序...原创 2018-11-04 23:13:29 · 916 阅读 · 1 评论 -
数据结构与算法学习--二分查找
二分查找(Binary Search)算法,也叫折半查找算法。二分查找针对的时一个有序的数据集合,查找思想有点类似于分治。每次都是通过和区间的中间元素进行比较,将待查区缩小为原来的一半,直到将元素找到或者区间缩小为0。我们可以通过2种方式实现:递归和非递归/*********************************************************************...原创 2018-11-02 11:04:45 · 731 阅读 · 0 评论 -
数据结构与算法学习--排序(桶排序,计数排序,基数排序)
基数排序和计数排序可以参照链接桶排序:桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将阵列分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的阵列内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是 比较排序,他不受到 O(n log n) 下限...原创 2018-10-30 22:31:11 · 593 阅读 · 0 评论 -
数据结构与算法学习--排序总结
排序算法已经学习完了,但是在项目开发过程中如果去选择一个高效的排序算法;下面是对前面几种算法的总结。如何实现一个通用的、高效率的排序函数线性排序算法(计数、桶、计数排序)的时间复杂度比较低,但是适用的场景也比较特殊。如果针对小规模的数据进行排序,可以选择时间复杂度0(n^2)的算法;如果针对大规模的排序,时间复杂度0(nlogn)的算法更加高效。所以为了兼顾任意规模数据的排序,一般都会首选时...原创 2018-10-31 16:25:50 · 631 阅读 · 0 评论 -
数据结构与算法学习--排序(归并排序,快排序)
1、归并排序归并排序使用时分治思想,就是将大问题分解成子问题,一般都是通过递归来实现。下面是归并排序的代码实现。void merge_sort(int a[],int left,int right){ int middle = 0; /*递归结束条件*/ if(left >= right) { return; } middle = (left + rig...原创 2018-10-29 11:29:23 · 399 阅读 · 0 评论 -
数据结构与算法学习--排序(冒泡排序,插入排序,选择排序)
排序是最基本的算法,在项目开发中经常遇到,也是面试环节中考察最多的。1、冒泡、插入、选择三种排序的比较及代码实现“有序度”和“逆序度”:对于一个不完全有序的数组,如4,5,6,3,2,1,有序元素对为3个(4,5),(4,6),(5,6),有序度为3,逆序度为12;对于一个完全有序的数组,如1,2,3,4,5,6,有序度就是n*(n-1)/2,也就是15,称作满有序度;逆序度=满有序度-有序...原创 2018-10-28 11:42:11 · 884 阅读 · 0 评论 -
数据结构与算法学习--队列
今天我们开始学习队列的;队列在实际项目开发中使用的很广泛,比如我们经常说的线程池,在处理大部分资源不足的情况下,都会考虑使用队列来缓存请求数据。1、阻塞队列阻塞队列时一种典型的“生产者–消费者”模型,就在队列的基础上增加的阻塞的功能(其实就是一种同步机制)。当队列为空时,出队阻塞;当队列满时,入队阻塞。还有下面多消费者–单生产者模式。上面的就是我们线程池的基本架构,在多个线程同时操作队...原创 2018-10-15 23:40:07 · 383 阅读 · 0 评论 -
数据结构与算法学习:数组
今天我们开始学习最基本,最简单的数据类型:数组;它是一种线性数据结构。具有一组连续的内存空间来存储相同数据类型的结构。原创 2018-10-07 20:58:45 · 333 阅读 · 0 评论 -
数据结构与算法学习--栈
1、顺序栈的实现:/************************************************************************* > File Name: arrayStack.h > Author: jinshaohui > Mail: [email protected] > Time: 18-10-..原创 2018-10-13 16:26:51 · 463 阅读 · 0 评论 -
程序内存分布区域
一、C语言可执行代码结构名称 内容代码段 可执行代码、字符串常量 数据段 已初始化全局变量、已初始化全局静态变量、局部静态变量、常量数据 BSS段 未初始化全局变量,未初始化全局静态变量 栈 局部变量、函数参数 堆 动态内存分配 一般情况下,一个可执行二进制程序(更确切的说,在Linux操作系统下为一个进程单元,在UC/OSII中被称为任务)在存储(没...转载 2018-03-28 22:23:32 · 804 阅读 · 0 评论 -
写让别人能读懂的代码
随着软件行业的不断发展,历史遗留的程序越来越多,代码的维护成本越来越大,甚至大于开发成本。而新功能的开发又常常依赖于旧代码,阅读旧代码所花费的时间几乎要大于写新功能的代码。我前几天看了一本书,书中有这么一句话:“复杂的代码往往都是新手所写,只有经验老道的高手才能写出简单,富有表现力的代码”此话虽然说的有点夸张,可是也说明了经验的重要性。我们所写的代码除了让机器执行外,还需要别人来阅读。所以我们要:转载 2015-10-25 19:20:43 · 2118 阅读 · 0 评论 -
C 语言中的指针和内存泄漏
引言对于任何使用 C 语言的人,如果问他们 C 语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏。这些的确是消耗了开发人员大多数调试时间的事项。指针和内存泄漏对某些开发人员来说似乎令人畏惧,但是一旦您了解了指针及其关联内存操作的基础,它们就是您在 C 语言中拥有的最强大工具。本文将与您分享开发人员在开始使用指针来编程前应该知道的秘密。本文内容包括:导致内存破坏的指针操作类型在使用动态内原创 2015-09-13 19:40:12 · 3427 阅读 · 0 评论 -
linux C 实现FTP客户端
****************************************************************************************我已参加2014“博客之星的”评选,觉得我的文章对您有帮助的,请投上您宝贵的一票************************************************************************原创 2015-01-10 11:07:20 · 11449 阅读 · 12 评论 -
十个最值得阅读学习的C开源项目代码
开源世界有许多优秀的开源项目,我选取其中十个最优秀的、最轻量级的C语言的项目,希望可以为C语言开发人员提供参考。1. WebbenchWebbench是一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力。Webbench使用C语言编写, 代码实在太简洁,源码加起来不到6转载 2014-10-24 09:04:32 · 4186 阅读 · 0 评论 -
浅谈优先队列(priority queue)
优先队列简述 与前面F I F O结构的队列不同,优先队列中元素出队列的顺序由元素的优先级决定。从优先队列中删除元素是根据优先权高或低的次序,而不是元素进入队列的次序。 优先队列(priority queue)是0个或多个元素的集合,每个元素都有一个优先权或值,对优先队列执行的操作有1) 查找;2) 插入一个新元素;3) 删除。在最小优先队列(min priorityq u e u原创 2013-01-28 21:53:07 · 14859 阅读 · 0 评论 -
C算法精解-----哈希表(2)
前面对链式哈希表的定义、实现、分析的一下,感觉也不是想象中的那么难,只要把思路理清,在草稿纸上画下他的实现思路,代码阅读起来也就一目了然了。下次再看时,只要把当初画的草图一拿出来就知道,当初定义的函数接口:插入、删除、查找是怎么实现的。数据结构本身就是很抽象的东西。对初学者来说,画草图是很容易理解代码实现思路。 下面介绍另外一种哈希表的实现方法 :开地址哈希表的描述。 在链式哈希表中,原创 2013-01-12 22:15:17 · 5704 阅读 · 4 评论 -
C算法精解-----哈希表(1)
前面写过一篇哈希表在检索SIP电话中的应用,是在阅读代码中遇到的,而专门去学习了哈希表的基本思想和哈希函数。下面自己阅读C算法精解书籍中自己总结了下面的内容。只总结一小部分,随后会继续更新。现在也在学习思维导图的应用,前面的博客中已经使用过。下面就利用思维导图总结的哈希表的内容: 下面介绍个经典的字符串哈希函数:/*hashpjw.c*/unsigned int h原创 2013-01-07 22:47:14 · 5156 阅读 · 5 评论 -
操作系统内存分配原理(帖子中转载)
刚在浏览帖子的时候,看到这个帖子,对内存分配的原理讲得很透彻,看了一遍,还未理解透彻,特收藏下来,以后慢慢回味! 现象1 压力测试过程中,发现被测对象性能不够理想,具体表现为: 进程的系统态CPU消耗20,用户态CPU消耗10,系统idle大约70 2 用ps -o majflt,minflt -C program命令查看,发现majflt每秒增量为0,而minflt每秒增量大转载 2012-12-25 10:22:35 · 3932 阅读 · 0 评论 -
Linux rpm 命令参数使用详解[介绍和应用]
RPM是RedHat Package Manager(RedHat软件包管理工具)类似Windows里面的“添加/删除程序”rpm 执行安装包二进制包(Binary)以及源代码包(Source)两种。二进制包可以直接安装在计算机中,而源代码包将会由RPM自动编译、安装。源代码包经常以src.rpm作为后缀名。常用命令组合: -ivh:安装显示安装进度--install--v转载 2012-12-24 12:09:15 · 1442 阅读 · 0 评论 -
高级C数据类型
1、前言 指针、结构体、联合体、动态内存分配及类型名生命(typedef)是创建C数据类型和算法的基本元素。尽管这些是经常在代码中遇见的,但是其用法的规范性、效率及代码的优化行仍然是大部分程序员所忽视的。所有有必要和大家讨论下这些问题,以提高代码的编写质量。2、指针 指针在C语言中的用法大概可以分为以下几类: 创建链式数据结构 引用动态分配的数据结构原创 2012-12-19 23:10:22 · 1754 阅读 · 0 评论 -
尾递归与Continuation
尾递归与Continuation 递归与尾递归关于递归操作,相信大家都已经不陌生。简单地说,一个函数直接或间接地调用自身,是为直接或间接递归。例如,我们可以使用递归来计算一个单向链表的长度:public class Node{ public Node(int value, Node next) { this.Value = valu转载 2012-12-06 22:26:29 · 1412 阅读 · 0 评论 -
浅谈尾递归的优化方式
浅谈尾递归的优化方式 尾递归的循环优化尾递归,即是递归调用放在方法末尾的递归方式,如经典的阶乘:int FactorialTailRecursion(int n, int acc){ if (n == 0) return acc; return FactorialTailRecursion(n - 1, acc * n);}由于递归在方法转载 2012-12-06 22:32:31 · 1477 阅读 · 0 评论