C
文章平均质量分 76
sandmm112
这个作者很懒,什么都没留下…
展开
-
七大排序算法(5)------快速排序(递归和非递归)
在本文中使用到的升序,降序,交换函数的代码见:这篇博客快速排序(递归实现) 快速排序的基本思想是在待排序序列中找到一个基准值(一般取待排序序列的最后一个元素),然后将该基准值放置在一个合适的位置,使得在基准值之前的元素都小于等于基准值,基准值之后的元素都大于等于基准值。 然后再对基准值之前的序列使用上述方法进行排序寻找基准值位置,对基准值之...原创 2018-05-31 20:37:09 · 2697 阅读 · 0 评论 -
数据结构------堆的相关操作
堆的概念 堆实际上还是一棵二叉树,不过它还满足下列两点要求:(1)堆是一棵完全二叉树。(关于完全二叉树的定义见:数据结构------二叉树的面试题)(2)堆中元素满足:对任一棵树来说,它的根节点的值比它的左,右孩子都大或都小(注意:左右孩子之间没有明确的大小关系)。 根节点的值比它的左,右孩子元素都大的堆称为大(根)堆。 根节点的值比它的左,右孩子元素都小...原创 2018-05-12 19:06:58 · 346 阅读 · 0 评论 -
迷宫问题求解
问题一:在迷宫中找到出口(只需找到一个即可) 给定一张迷宫地图和一个迷宫入口,然后进入迷宫探索找到一个出口。问题分析:1. 首先要有一张迷宫地图,地图由两部分组成: (1)一是迷宫中各处的位置坐标, (2)二是迷宫各位置处的状态信息,即该处是墙还是路 所以,该迷宫地图可由一个二维数组来表示。数组的横纵坐标表示迷宫各处的位置坐标,数组元素表示各位置处的状态信息...原创 2018-04-21 01:32:52 · 34034 阅读 · 3 评论 -
数据结构-------二叉树的基本操作(递归实现)
首先介绍二叉树的概念。 不同于链表等线性表,树是一种非线性表。除了根节点没有前驱外,其余节点都有唯一的一个双亲结点和多个或0个孩子节点。其中,对每个节点来说,最多有两个孩子节点的称为二叉树。二叉树的几种形式如下图: 对于二叉树的任一结点,都可以表示为以上的任一一种形式。所以,一个二叉树是由无数个子树组成。每棵子树都可以表示为上图中的任一一种形式。因此,在...原创 2018-05-03 00:32:32 · 6431 阅读 · 1 评论 -
线程的同步与互斥
在之前的“进程间通信—-信号量”一文中,有介绍过进程的同步与互斥。在本文中,着重来介绍线程的互斥与同步。线程的互斥我们知道,一个进程中的多个线程之间是共享进程所拥有的一个地址空间。它们除了私有上下文,私有栈等少量资源是独有的,其余大部分资源都是共享的。比如说,文件描述符表。当一个线程以只读的方式打开某一文件时,与它所在同一进程的其他线程也是可以读取该文件的。多个线程之间共享资源。这对于...原创 2018-04-24 00:20:14 · 627 阅读 · 0 评论 -
栈和队列常见笔试题
以下有关栈的知识请见这篇博客:https://blog.csdn.net/sandmm112/article/details/79860236 以下有关队列的知识请见这篇博客:https://blog.csdn.net/sandmm112/article/details/79860257 前面我们介绍过了栈和队列的两种实现方法以及一些基本操作。下面利用之...原创 2018-04-16 14:53:02 · 4085 阅读 · 0 评论 -
顺序队列/链式队列
队列是另一种限定性的线性表,他只允许在表的一端插入元素,而在表的另一端删除元素,具有“先进先出”的特点。在队列中,允许插入的一端称为队尾,允许删除的一端称为队首。 与线性表相似,队列也有两种存储结构:顺序队列和链式队列。一,顺序队列 顺序队列使用顺序表来实现的,即队列中的元素均存放在一片连续的内存空间中。通过该片内存的地址对队列中元素进行访问。之前是用数...原创 2018-04-09 15:49:55 · 2150 阅读 · 0 评论 -
单链表的常见笔试题(2)
本文中接着列举一些常见的有关单链表的笔试题。1. 判断单链表是否带环 如果一个链表带环,则该链表的尾节点的next必不指向空,而是指向在他之前的某一节点,类似这样的: 那么该如何判断呢?方法一: 首先将头结点的地址存放在一个顺序表中。从头开始遍历链表,比较每个节点的next域是否在顺序表中出现,如果出现了,说明该链表带环,如果没有出现,将该...原创 2018-04-01 17:12:10 · 437 阅读 · 0 评论 -
顺序栈/链式栈
栈是是一种限定性的线性表,它将线性表的插入和删除限定为仅在表的一端进行。将表中允许插入和删除的一端成为栈顶。所以栈顶的位置是不断动态变化的。它具有“后进先出”的特点。因为栈是由线性表实现的,所以,栈有两种存储结构:顺序存储和链式存储。对应的栈成为顺序栈和链式栈。下面,分别来介绍这两种栈的相关操作。一,顺序栈 它与顺序表类似,即用一组地址连续的空间存放栈中的元素。之前的...原创 2018-04-09 00:30:44 · 11379 阅读 · 0 评论 -
双向,带头节点,带环链表的基本操作
前面已经介绍过了不带头节点,不带环的双向链表,以下将介绍带头节点,带环的双向链表的基本操作。 不带头结点时,用一个头指针代表整个链表。带头节点,则用头结点来表示整个链表。此时,头结点的数据域是没有意义的,对其任意赋值即可。如下图: 当链表是单向时,只有一个next指针指向下一个节点。而双向时,除有next指向下一个节点外,还有一个prev指针指向前一个结...原创 2018-04-08 22:07:33 · 516 阅读 · 0 评论 -
单链表的常见笔试题(1)
在之前的“单链表基本操作”博客中,介绍了一些关于单链表的增删查改等基本操作。在本文中,对单链表的操作升级,列举一些常见的有关单链表的常见笔试题。 注意:该单链表还是无头结点,单向,无环的。有关链表的信息与“单链表基本操作中”相同。1. 逆序打印单链表 链表正常的输出顺序是从头开始输出,如果逆序的话,最后输出的是头结点,先输出的是最后一个节点,此过程可以通...原创 2018-04-01 11:17:03 · 836 阅读 · 0 评论 -
系统调用接口,文件描述符,重定向,FILE,动/静态库
一. C库函数 之前,我们有用fopen,fclose,fread,fwrite来对文件进行打开,关闭,读取,写入操作。上述几个函数都是C标准库中的函数。在调用以上函数时,都会涉及到一个FILE*指针,那它到底是什么呢? 这里,首先要知道C库函数是对系统调用的一层封装,也就是说,在执行C库函数时,这些函数调用了系统提供的接口函数。上述四个函数调用的系统接...原创 2018-03-31 19:19:20 · 406 阅读 · 0 评论 -
数据结构------搜索二叉树的相关操作(递归和非递归版本)
搜索二叉树的概念 搜索二叉树满足下面两个要求:(1)它是一棵二叉树(2)该二叉树中,任意一棵树的根节点值大于它左子树中的所有结点的值,小于右子树中的所有结点的值 因此对于搜索二叉树的中序遍历来说,它是按由小到大依次递增的顺序排列的。搜索二叉树的相关操作 在本文中将介绍搜索二叉树的以下操作:(1)初始化搜索二叉树(2)在搜索二叉树中插入指定元素(递归实现)(...原创 2018-05-13 09:29:54 · 497 阅读 · 0 评论 -
数据结构------二叉树的面试题
在数据结构------二叉树的基本操作(递归实现)一文中,介绍了二叉树的结构定义以及一些基本操作,本文将继续介绍一些有关二叉树的面试题。1. 非递归实现二叉树的先序遍历 二叉树的非递归先序遍历要通过一个栈来实现。 先序的遍历的访问顺序为先根节点,再左孩子,最后右孩子。所以,根据栈后进先出的特点,应先入栈右孩子,再入栈左孩子。(1)根节点入栈(2)取栈顶元...原创 2018-05-06 20:50:17 · 454 阅读 · 0 评论 -
网络编程------TCP协议实现网络版三子棋小游戏
以下用到的TCP协议的程序代码见:网络编程------TCP协议网络程序以下用到的三子棋的游戏规则的相关代码见:三子棋 在网络编程------TCP协议网络程序一文中根据TCP协议分别实现了单进程,多进程,多线程版本的服务器端程序。在多进程和多线程环境中服务器可以同时接收来自多个客户端的连接请求并与之互发消息进行通信。在本文中将继续根据TCP协议来实现与客户端的通信。 ...原创 2018-05-13 19:58:29 · 3516 阅读 · 2 评论 -
七大排序算法(4)------归并排序(递归和非递归)
在本文中使用到的升序,降序,交换函数的代码实现见:这篇博客 在单链表的基本操作中,有一个操作为合并两个有序的单链表使合并后的链表仍然有序。本文中归并排序与这个思想类似。不断使两两有序的序列进行合并。归并排序(递归实现) 例如,有一待排序序列:20 10 9 8 11 10 7 6。 排序过程如上图所示,(1)首先将待排序序...原创 2018-05-31 18:04:26 · 2188 阅读 · 0 评论 -
七大排序算法(3)------希尔排序
在本文中使用到的升序,降序,交换函数的代码以及插入排序的思想见:这篇博客 在上述博客中的插入排序中有介绍了插入排序的两个特点:(1)当待排序序列的有序性比较高时,排序的效率比较高;(2)当待排序序列的元素个数较少时,排序的效率比较高。 本文中介绍的希尔排序就是利用插入排序的两个特点来实现的。希尔排序 例如,待排序序列为:10 30 20 6...原创 2018-05-31 17:07:32 · 1759 阅读 · 0 评论 -
七大排序算法(2)------堆排序
在本文中使用到的升序,降序,交换函数的代码实现见:这篇博客 有关堆的相关概念和知识点见:原创 2018-05-31 11:53:38 · 313 阅读 · 0 评论 -
七大排序算法(1)------冒泡,选择,插入排序
本文中将介绍七大排序算法中的三种排序:冒泡排序,选择排序,插入排序。剩余的排序算法将在接下来的文章中一一介绍。 介于排序分为升序和降序两种,所以,这里将比较规则以回调函数的方式传入排序算法中,这样,在具体实现时,就可以根据不同的需求传递不同的函数指针进而达到不同的排序效果。 升序比较规则定义如下: 降序比较规则定义如下:1. 冒泡排序 ...原创 2018-05-31 09:55:46 · 405 阅读 · 0 评论 -
C语言------在一个整型数组中求连续子数组的最大和
题目:在一个整型数组中求连续子数组的最大和。连续子数组是指由1或多个下标连续的数组元素组成的数组。如数组:arr[] = {1,5,7},该数组的连续子数组为:{1},{5},{7},{1,5},{5,7},{1,5,7}。因此子数组{1,5,7}的和最大为13。 思路:(1)首先从数组下标为0开始求和,初始设置最大值为下标为0的数组元素值(2)如果加上某个数组元素时...原创 2018-05-24 19:22:27 · 6456 阅读 · 0 评论 -
数据结构------位图的基本操作
在之前的哈希表中,如果要在表中存放一个整数,此时就要申请一个整型的内存来存放它,一个整型数据在32位或64位平台下都占4个字节。如果现在需要存储的数据非常多,比如说40亿个不重复的数据,就需要160亿个字节来存储,1GB的内存表示的是10亿个字节,此时就需要16GB的内存来存放这些数据,而我们普通的电脑内存一般都是4G的内存,这显然是存放不下的。我们知道,内存中的最小单位是比特位。...原创 2018-05-23 16:13:41 · 1928 阅读 · 0 评论 -
数据结构------布隆过滤器的基本操作
下文中用到位图的相关知识和代码见博客:位图的基本操作 布隆过滤器主要用于在一个字符串集合中查找某个字符串是否存在。要在集合中查找,首先要将该字符串集合储存起来。那么该如何存储呢? 如果用链表,树等结构进行存储,当集合中的元素越来越多时,所占的空间就越来越大。查找的效率也会越来越低。如果用哈希表来存储,首先要根据字符串哈希函数计算字符串对应的数值...原创 2018-05-26 11:15:54 · 1899 阅读 · 0 评论 -
数据结构------基于哈希桶解决哈希冲突的哈希表
在原创 2018-05-21 22:24:46 · 817 阅读 · 1 评论 -
C语言------实现atoi函数
首先介绍atoi函数的功能:该函数的作用是将参数字符串转换为一个整数。(1)如果参数字符串以数字开头,则一直往后读,直到读到非数字字符或\0。然后将这些数字以整数形式返回。如:“62562hja”,返回整数62562。“1331”,返回整数1331。(2)如果参数字符串以正负号开头,则往后读取,如果紧接着读到数字,此时与(1)相同。只是在返回整数时要加正负号。如果正负号后面不是数字...原创 2018-05-14 22:41:07 · 4641 阅读 · 0 评论 -
数据结构------基于线性探测解决哈希冲突的哈希表
刹车原创 2018-05-21 11:51:16 · 4608 阅读 · 1 评论 -
C语言------将一个字符串中的空格转化为特殊字符
之前有提到过,在用URL标志原创 2018-05-25 00:44:44 · 2382 阅读 · 0 评论 -
单链表的基本操作
线性表有两种存储方式,一种是顺序表,在顺序表的基本操作中,有说过,顺序表是存放在一片连续的内存空间中,以物理位置的相邻来表示逻辑位置的相邻。当数据量过多时,对内存空间的利用率就比较低。 而线性表的另外一种表示就是链表,它没有占据一整片连续的内存,而是分散在一个个零散的区域中,以指针的形式将各个节点连接起来,以表示线性表逻辑上的相邻顺序。这样做可以提高对内存空间的利用率。...原创 2018-03-21 14:43:33 · 1124 阅读 · 1 评论 -
实现彩色进度条
如何在linux下实现一个彩色的进度条呢,先看下一条成熟的进度条: 实现一个彩色的进度条需实现以下几点:(1) 由#组成的进度条在一行上由少到多一个个增长,直到增加到已设定的值(2) 随着进度条的增长,在该行的结尾显示变化着的进度百分比(3) 在进度条增长的过程中,有一光圈不停转动,直到进度条完成(4) 将进度条变为彩色的 接下来,实现上述几点需求:1....原创 2018-03-12 11:49:14 · 604 阅读 · 0 评论 -
左旋字符串
题目:实现字符串左旋k个字符,如“abcdef”左旋一个字符,变为“bcdefa”,左旋两个字符,变为“cdefab”。分析:首先需考虑左旋的字符个数与字符串的长度之间的关系,在本题中,字符串长度为6,如果k为7,则相当于左旋一个字符,所以,要对k进行处理,得到有效的旋转次数。1,方法一(循环前移字符)分析: 旋转k个字符,首先我们会想到先旋转一个字符,然后在对k进行循环,实现原创 2018-02-07 14:52:51 · 216 阅读 · 0 评论 -
关于const和volatile
今天学了c语言中的两个关键词const和volatile。1.(1) const int num = 0; num= 10;因为const定义的变量为为“常”变量,所以不能被赋值。(2) const int num=0; int a[num];因为const定义的变量为为常“变”量,所以不能用作数组的长度。原创 2017-11-09 20:00:45 · 233 阅读 · 0 评论 -
C语言操作符
1. 算数操作符:+ - * / %+:加,正号,作用于整数和浮点数-:减法,负号,作用于整数和浮点数*:乘,作用于整数和浮点数/:整数除法:两个操作数均为整形数据,结果为商。浮点数除法:两个操作数中至少有一个浮点数%:两个操作数必须均为整数,结果余数。2. 移位操作符:>> a>>:按位右移。原创 2017-11-15 13:38:05 · 185 阅读 · 0 评论 -
二分法在有序数组中查找一个数
例:在一个有序数组{1,2,3,4,5,6,7,8,9,10}中查找元素7的下标算法思想:因为是有序数组,先查找中间下标的元素:(1)如果该元素等于7,则返回中间下标,查找结束; (2)如果该元素大于7,则7必然在中间元素的右边部分,则缩小范围,在右半部分查找7,再计算右半部分的中间下标,转到(1)(3)如果该元素下于7,则7必然在中间元素的左半部分,则缩小范原创 2017-11-19 21:57:44 · 3206 阅读 · 0 评论 -
数组
1. 一维数组的初始化和创建(1)数组元素类型 数组名[数组元素个数]其中数组元素个数必须为常量或常量表达式,不能为变量(2)给数组初始化:给数组初始化时,必须用{ }括起来,有以下几种方式:int arr[10]={0}; //此时数组元素个数给10,元素值全为0int arr[ ]={0,1,2,3,4,5}; //此时数组元素个数为6注意:当不写数组元素个原创 2017-11-20 22:18:33 · 464 阅读 · 0 评论 -
函数调用与栈帧
3. 利用下述程序理解函数调用时创建栈帧的过程#include#include void *main_ret =NULL; int bug(){int first = 0;int *p =&first;p+=2; *p =(int)main_ret; Sleep(1000);printf("haha,I catch you!, I am原创 2017-12-10 00:32:27 · 299 阅读 · 0 评论 -
可变参数列表的源代码剖析
//使用可变参数,实现函数,求函数参数的平均值。#define_CRT_SECURE_NO_WARNINGS1#include#include#includeint average1(intnum,...){ char*p = # int i = 1; intsum = 0; while(i num) {原创 2017-12-15 23:32:30 · 223 阅读 · 0 评论 -
数组,函数,指针
1. 指针数组是数组,是一个存放指针的数组例1:int *arr1[3]; //是一整型指针数组,该数组中有3个元素,每个元素均为指向整型数据的指针 char *arr2[4]; //同理,是一字符型指针数组,该数组中有4个元素,每个元素均为指向字符型数据的指针注意:[ ]的优先级比*的优先级高,所以,arr先与[ ]结合,形成数组,又因为有个*,原创 2018-01-04 16:35:01 · 183 阅读 · 0 评论 -
使用main函数的参数,实现一个整数计数器
题目:程序可以接受三个参数,第一个参数“ - a”选项执行加法,“ - s”选项执行减法,“ - m”选项执行乘法,“ - d”选项执行除法,后面两个参数为操作数。分析:main函数的参数有三个,形式为:int main(int argc,char *argv[],char *envp[])其中,argc为整型,表示程序接收的参数个数argv为字符指针数组,数组元素为一字符指针,分别指原创 2018-02-02 11:52:33 · 310 阅读 · 0 评论 -
冒泡法排序
今天运用冒泡法思想编了一个程序对三个整数进行排序,但不知道为什么结果一直不对,不知道哪里出了问题。#define _CRT_SECURE_NO_WARNINGS 1#includeint main(){ int a[3] = { 0 }; int i = 0, j=0; for (i = 0; i { scanf("%d", &a[i]); } in原创 2017-11-07 19:43:54 · 219 阅读 · 0 评论 -
打印素数
今天开始系统的学习C与C++了,看到一个人脸形状的代码,运行出来的结果还是人脸,觉得非常有趣,非常吸引我。虽然我还远远达不到这种水平,但我会一直努力前进的。C刚入门,编了个小程序:题目:打印100到200之间的素数代码:#includeint main(){ int i, j, k; printf("100到200之间的素数为:\n"); for (i = 10原创 2017-11-04 15:28:23 · 265 阅读 · 0 评论 -
利用可变参数列表简单实现printf函数的功能
利用可变参数来实现输出函数,有两点必须已知:第一,需知输出参数的个数,这个 可以通过可变参数列表的第一个参数可知。第二,需知各输出参数的类型,这个也可以通过可变参数列表的第一个参数可知。例如:实现输出:hello world! 100则传参时,可将hello看做一字符串,world看做5个字符,!原样输出,100为整数输出,即可表示为:myprintf("%s %c%c%c%c原创 2018-01-31 13:42:02 · 350 阅读 · 0 评论