c语言
文章平均质量分 56
zhao_miao
冲鸭
展开
-
使用两个栈实现一个队列
题目:使用两个栈实现一个队列。 栈:后进先出。 队列:先进先出。 入队列: 直接入栈1。 出队列: 返回队列的队尾元素: 返回队列的队头元素: 队列为空: 栈1为空&&栈2为空。 队列元素个数: 栈1的元素个数+栈2的元素个数。参考代码: 设置一个队列由两个栈组成: typedef struct Queue{原创 2018-08-25 08:46:48 · 3287 阅读 · 0 评论 -
一个数组实现两个栈(共享栈)
题目: 一个数组实现两个栈。 方法1: 下标为0的位置为栈1的栈底,下标为1的位置为栈2的栈底,栈1的元素存放在下标为偶数的位置上,栈2的元素放在下标为奇数的位置上。 如上图所示的数组:若栈1有一个元素 2,栈2有6个元素 1,2,3,4,5,6,下标为0的位置为 2,下标为1,3,5,7,9的位置分别为1,2,3,4,5。6无法插入但数组中还有很多剩余的空间。。可见该方法会...原创 2018-08-23 20:10:52 · 11437 阅读 · 1 评论 -
扫雷游戏 c语言实现
代码思路:打印菜单,用户选择是否玩游戏(1——表示玩游戏,0——表示退出游戏); 设置两个数组,数组mine用来布雷(srand()和rand()配合使用,雷用‘1’表示),数组show用于输出; 如果第一次是雷,则将雷移走,如果不是雷,则计算它周围有多少雷并输出; 如果之后又踩雷则炸死,执行row*col-Easy_Count次没有炸死即为成功; 坐标周围没雷,可以实现展开; 重新...原创 2018-04-07 11:06:58 · 350 阅读 · 0 评论 -
返回参数二进制中1的个数
方法1: 辗转相除法 比如 :十进制数1234,想知道十进制中1的个数。 1234 --------num num%10==4 num=num/10; 123 --------num num%10==3 num=num/10...原创 2018-03-29 20:11:19 · 550 阅读 · 2 评论 -
猜数游戏
要求:电脑随机生成一个数,用户猜数,如果猜小了,电脑提示猜小了,如果猜大了,电脑提示猜大了。如果相等,则猜数成功。//猜数游戏#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<time.h>enum guess{ EXIT, PLAY}...原创 2018-04-03 22:31:58 · 3122 阅读 · 0 评论 -
sizeof()和strlen()的区别
sizeof: 求所分配的字节数,单位是字节;strlen: 获取字符的个数;几个重要的知识点: 数组名单独放在sizeof内部,数组名表示整个数组的大小; &+数组名,数组名表示整个数组;&数组名,取出的是整个数组的地址; 除此之外,所有的数组名都是首元素的地址; 一些典型的例子:#define _CRT...原创 2018-04-01 19:57:53 · 985 阅读 · 0 评论 -
三子棋 c语言实现
思路:打印菜单供用户选择玩或者不玩,如果不玩直接退出游戏;如果玩>打印3*3棋盘; 用户走一步,判断输赢;电脑随机走一步,判断输赢;三个字符相等且连为一条线即为赢,奇葩铺满即为平局; 一局结束后,选择继续游戏还是退出循环;game.h#define _CRT_SECURE_NO_WARNINGS 1#ifndef __GAME_H__#define __GAME_...原创 2018-04-05 18:13:03 · 476 阅读 · 0 评论 -
c 推测题型
例1:日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个嫌疑犯的供词。 A说:不是我。B说:是C。C说:是D。D说:C在胡说已知3个人说了真话,1个人说的是假话。现在请根据这些信息,写一个程序来确定到底谁是凶手。 数学逻辑:由于只有一个人说了假话,其余人都是真话。假设A是嫌疑犯,那么A,B,C均说了假话,假设不成立。 假设B是嫌疑犯,那...原创 2018-04-15 14:13:07 · 194 阅读 · 1 评论 -
宏和函数的区别
宏通常被应用于执行简单的算法,比如找出两个数中的最大值:#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#define Max(x,y) x>y?x:yint main(){ int a = 0; int b = 0; int c = 0; printf("E...原创 2018-04-15 15:48:53 · 477 阅读 · 0 评论 -
函数递归
什么是递归? 程序调用自身的编程技巧成为递归(recursion)。 它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来解决,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大减少了程序的代码量。 递归的主要思考方式:大事化小 递归的两个必要条件: 1. 需要存在限制条件,当满足这个限制条件的时候,递归便不再继续。 2. 每次递归调用之后越来越接...原创 2018-05-01 21:00:35 · 477 阅读 · 0 评论 -
函数的调用过程(栈帧)
先看一个简单的代码:#include<stdio.h>#include<stdlib.h>int Add(int x, int y){ int z = 0; z = x + y; return z;}int main(){ int a = 10; int b = 20; int ret = 0; ret = Add(a, b); print...原创 2018-04-22 16:04:40 · 350 阅读 · 0 评论 -
可变参数列表解析
首先看一个例子: 练习1:求任意个数参数的平均值#include&amp;amp;lt;stdio.h&amp;amp;gt;#include&amp;amp;lt;stdlib.h&amp;amp;gt;#include&amp;amp;lt;stdarg.h&amp;amp;gt;int average(int n,...){ va_list arg; int i = 0;原创 2018-05-02 11:16:24 · 147 阅读 · 0 评论 -
模拟实现strlen的三种方法
strlen用于求字符串的长度(不包括字符串结束标志\0) 例如:s=”abcd” strlen(s)=4; s=”abcdef” strlen(s)=6; 在库函数中,它的头文件是#include#include&amp;amp;lt;stdio.h&amp;amp;gt;#include&amp;amp;lt;stdlib.h&amp;amp;gt;#include&amp;amp;l原创 2018-05-02 20:09:18 · 793 阅读 · 1 评论 -
memcpy和memmove的区别
区别 memcpy()和memmove()都是c语言库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容。它们唯一的区别是当内存发生局部重叠时,memmove可以保证拷贝正确,memcpy拷贝的结果是不确定的。memcpy: 原型: 作用是将src里面count个字节拷贝到dest中。//memcpy内存拷贝(仅仅实现不相关的内存拷贝)#include&l...原创 2018-09-04 16:30:30 · 3863 阅读 · 1 评论 -
二叉搜索树的创建,删除,查找
二叉搜索树的概念 二叉搜索树又称二叉排序树,它或者是一颗空树,或者是具有以下性质的二叉树若它的左子树不为空,则左子树上的所有结点的值都小于根结点的值。若它的右子树不为空,则右子树上的所有结点的值都大于根节点的值。它的左右子树也分别为二叉搜索树。 二叉搜索树的操作 查找关键字data:①.若根节点为空,即二叉搜索树为空。返回0。 ②.若data&amp;amp;gt;根节点的da...原创 2018-09-02 09:11:58 · 6977 阅读 · 2 评论 -
堆排序算法详解及实现-----------c语言
堆排序原理: 堆排序指的是将大堆(小堆)堆顶(即下标为0)元素与堆的最后一个(即下标为hp-&amp;amp;amp;amp;amp;amp;amp;amp;gt;size - 1)元素交换,hp-&amp;amp;amp;amp;amp;amp;amp;amp;gt;size–,将其余的元素再次调整成大堆(小堆),再次将堆顶(即下标为0)元素与堆的最后一个(即下标为hp-&amp;amp;amp;amp;amp;amp;amp;amp;gt;size -原创 2018-09-21 20:33:13 · 1916 阅读 · 0 评论 -
冒泡排序------c语言
冒泡排序的思路: 1. 数据两两比较,将较大的数据挪到后面,这样一次循环后就可以确定一个元素的最终位置。 2. 接着从头开始两两比较,将次大的数据挪到上次已经排序好的数据的前一个位置。 3. 重复size-1次即可将size-1个元素放到它的最终位置上,这样剩下的那个元素肯定在自己的最终位置上,冒泡排序结束。 代码实现:#include&amp;lt;string.h&amp;gt;...原创 2018-09-21 18:17:29 · 640 阅读 · 0 评论 -
归并排序
归并排序与快速排序的思想基本一致,唯一不同的是归并排序的基准值是数组的中间元素。 关于快速排序的思想代码:#include<stdlib.h>#include<stdio.h>#include<string.h>void Print(int *arr,int size);//归并void Merge_sort(int *arr, int...原创 2018-09-26 20:35:35 · 153 阅读 · 0 评论 -
选择排序及选择排序的优化算法详解及实现----c语言
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置(或末尾位置),直到全部待排序的数据元素排完。 由于选择排序一次能确定一个元素的位置,所以选择排序需要循环size-1次。 算法的稳定性: 不稳定 (比如序列【5, 5*, 3】第一趟就将第一个[5]与[3]交换,导致第一个5挪动...原创 2018-09-20 18:22:18 · 14090 阅读 · 4 评论 -
希尔排序算法详解及实现---c语言
插入排序算法详解及实现 关于插入排序我们知道,它适用于有少量数据的情况,但是若数据量比较大我们应该如何进行排序呢? 一种方法当然是希尔排序。 希尔排序也是利用插入排序的思想来排序。希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝最终位置前进一大步。然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需排序的数...原创 2018-09-20 16:26:09 · 10255 阅读 · 1 评论 -
布隆过滤器(Bloom Filter)(给两个文件,分别有100亿个字符串,我们只要1g的内存,如何找到两个文件的交集?分别给出精确算法和近似算法?)
给两个文件,分别有100亿个字符串,我们只要1g的内存,如何找到两个文件的交集?分别给出精确算法和近似算法? 精确算法: 我们可以创建1000个文件,运用哈希函数先将文件1的字符串保存在对应的文件中,之后再文件2中取元素,通过哈希函数计算出哈希地址,去对应的文件里面找是否有与之相同的字符串。 近似算法: 我们可以使用位图的方法,通过一个函数将一个元素映射成一个位矩阵中的一个点,这样...原创 2018-09-15 12:59:22 · 2020 阅读 · 0 评论 -
哈希变形----位图(假设给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中)
位图: 假设给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。遍历:将元素保存起来,遍历查找。树:创建一颗二叉搜索树。排序:排序之后用二分查找的方法。 这些方法随着集合中元素的增加,我们需要的存储空间就越来越大、不过我们可以通过一个函数将一个元素映射成一个位矩阵中的一个点,这样一来,我们只要看看这个点是不是1就知道集合里有没有它...原创 2018-09-14 20:43:40 · 477 阅读 · 0 评论 -
快速排序的非递归实现-----c语言
前面我们讲解了快速排序的递归实现,但若是待排序的数量非常大且杂乱无章,每层循环都使用递归调用,会很容易造成栈溢出,所以我们可以将快速排序设计为非递归实现。递归实现快速排序算法详解 快速排序是从序列中选择一个基准值,按照某种方式将该区间分成两部分,基准值左侧所有元素比基准值小,基准值右侧所有元素比基准值大。然后排基准值左侧部分,排基准值右侧部分。 若想把快速排序改成循环最重要的是将基准...原创 2018-09-25 17:53:36 · 9921 阅读 · 8 评论 -
堆的创建、插入、删除、堆排序
堆的概念: 如果有一个关键码的集合K={K(0),K(1),K(2)……K(n-1)},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:K(i)<=k(2* i+1)且 K(i)<=k(2* i+2)(K(i)>=k(2* i+1)且 K(i)>=k(2*i+2))i=0,1,2……则称为小堆(或大堆)。 说明: 任一结点的关键码均小于(...原创 2018-09-14 17:26:35 · 3598 阅读 · 1 评论 -
快速排序算法的递归实现(Hoare版本、挖坑法、前后指针)
快速排序的思想: 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值 ,按照该基准值将待排序集合分割成两个子序列,左子序列中的所有元素小于基准值,右子序列中所有元素均大于基准值,然后对左右子序列重复该过程,知道所有的元素都排列在相应位置上为止。将区间按照基准值划分为左右两部分的常见方法有: Hoare版本 挖坑法...原创 2018-09-24 15:35:51 · 1488 阅读 · 0 评论 -
哈希表(散列表)、哈希表闭散列(线性探测、二次探测)解决冲突、负载因子
哈希概念常规搜索: 数据杂乱无章——-&amp;gt;顺序查找—–&amp;gt;时间复杂度0(n)。 数据有序—–&amp;gt;二分查找——&amp;gt;时间复杂度0(log(n))。 建立二叉搜索树—–&amp;gt;时间复杂度0(n)(单支树)。 理想的搜索方法是:可以不经过任何比较,一次直接从表中得到要搜索的元素,如果构造一种存储结构,通过某种函数使元素的存储位置与它的关键码之间能够建立一一映原创 2018-09-13 15:36:45 · 5972 阅读 · 3 评论 -
插入算法算法详解及实现----c语言
插入排序: 每一步将一个待排序的元素,按照其大小,插入到已经排好序的数组的合适位置上去,使得数组依然有序。 换句话说,即将一组数据分成两组,我分别将其称为有序组与待插入组。每次从待插入组中取出一个元素,与有序组的元素进行比较,并找到合适的位置,将该元素插到有序组当中。就这样,每次插入一个元素,有序组增加,待插入组减少。直到待插入组元素个数为0。 时间复杂度: 最差情况下:0(n^...原创 2018-09-17 10:21:27 · 5488 阅读 · 0 评论 -
二叉搜索树的应用---判断一个单词拼写是否正确、模拟实现简单字典
关于二叉搜索树的基本知识点:二叉搜索树的创建,删除,查找 模拟实现一个简单的字典即将二叉搜索树里数据域改为单词和翻译。查找时与单词比较,若相等,返回它的翻译。 代码: BSWordTree.h#define _CRT_SECURE_NO_WARNINGS 1#include&amp;amp;lt;assert.h&amp;amp;gt;#include&amp;amp;lt;stdio.h&amp;amp;gt;#inc原创 2018-09-02 16:43:44 · 559 阅读 · 0 评论 -
指针数组 数组指针 函数指针 函数指针数组 指向函数指针数组的指针
指针数组 什么是指针数组?指针数组是指针还是数组? 正如“好孩子”而言,强调的是孩子而不是好,所以指针数组是一个数组。 那我们先了解一下什么是数组? 数组就是相同类型元素的集合 正如:整形数组存放整形; 字符型数组存放字符; 所以,指针数组存放指针; 即: 指针数组用于存放指针//你认为哪一个是指针数组?int *arr1[10];char *ar...原创 2018-05-06 17:01:40 · 261 阅读 · 0 评论 -
模拟实现printf
模拟实现printf 一:printf函数介绍 printf是格式化的输出函数。 举个例子: 我们想输出原创 2018-05-10 14:16:58 · 497 阅读 · 0 评论 -
判断两个单链表是否相交?若相交求交点?(单链表无环)
怎样判断单链表是否相交? 如果两个链表相交,则两个链表就会有相同的结点。 方法1. 依次判断第一个链表中的结点是否都在第二个链表中。 方法2. 若两个单链表相交,则从交点之后的链表结点内容是一样的,即两个单链表最后一个结点一定是相同的,我们可以遍历两个结点,判断最后一个元素地址是否相同。 方法3.构环,将L2的最后一个结点指向L2的头结点,构成环,判断L1链表是否有...原创 2018-07-27 20:13:26 · 1070 阅读 · 0 评论 -
变量的分类
按照作用域: 全局变量 所有代码块之外。局部变量 代码块之内。按照存储方式: 自动变量(auto变量) 定义该变量的函数被调用时才给它分配内存单元,开始它的生存期,函数调用结束,释放存储单元,结束生命周期。(注:系统不会对自动变量进行初始化赋值)静态变量 静态局部变量:在函数内定义,但是当函数退出后,静态局部变量始终还存在,其占用的...原创 2018-07-28 21:40:09 · 1505 阅读 · 0 评论 -
一维数组和二维数组相关知识点
一维数组: 创建 type_t arr_name [const_n]int arr1[10];char arr2[10];float arr3[10];double arr4[2];初始化 int arr[10] = {1,2,3};int arr1[]={1,2,3,4};char arr2[3]={'a',98,'c'};char arr3[]={'a','b',...原创 2018-07-29 19:23:05 · 2172 阅读 · 0 评论 -
复杂链表的复制(链表的每个结点,有一个next指针指向下一个结点,还有一个random指针指向这个链表中的一个随机结点或者NULL)
举一个复杂链表的例子: 首先我们需要创建一个复杂链表: 1. 要创建链表首先需要一个结构体:(结构体成员须包括数据,next指针,以及random指针)typedef struct node{ DataType data; struct node* next; struct node* random;}Clinklist;创建如上图所示的复杂链表...原创 2018-08-14 10:09:30 · 2382 阅读 · 0 评论 -
查找链表的倒数第k个结点(只能遍历一次结点),删除链表的倒数第k个结点。
查找链表的倒数第k个结点 方法:设置两个指针fast,slow 让快指针先走k步,随后两个指针一起向后移动,当快指针为空时,慢指针指向的结点即为链表的倒数第k个结点。 linklist * FindLastKNode(linklist *head,int k){ linklist *fast = head; linklist *slow = head; ...原创 2018-08-15 16:34:11 · 777 阅读 · 0 评论 -
单链表的冒泡排序
单链表的冒泡排序 设置三个指针tail,p,cur;p和tail用于控制外循环的次数,cur用于内循环。排序开始前遍历一次单链表将tail指向尾结点的指针域,即NULL。cur和p均指向头结点。比较cur-&gt;data与cur-&gt;next-&gt;data的大小,若前者大于后者则交换;否则不交换,之后cur指针右移,继续比较cur-&gt;data与cur-&gt;next-...原创 2018-08-15 18:15:07 · 21328 阅读 · 8 评论 -
判断两个链表是否相交?若相交求出交点?(两个链表均带环)
关于链表相交的问题如果两个链表均不带环 判断两个不带环单链表是否相交?若相交求交点如果一个链表带环,一个链表不带环。两个链表不可能相交! 如果两个链表均带环:(有以下两种相交的情况) 如何判断链表是否带环,以及如何求环的入口点判断两个带环单链表是否相交: 分别判断两个单链表p1,p2是否带环,返回快慢指针的交点(此交点必在环内)meet1,meet2,一个指针不动,另一...原创 2018-08-16 19:23:55 · 565 阅读 · 0 评论 -
逆波兰表达式(后缀表达式)的计算
后缀表达式计算时,所有运算按照运算符出现的顺序,严格从左到右,每个操作符取前两个操作数进行运算,运算后的结果仍然作为下次的操作数。 那如果已知后缀表达式,如何求值: 举一个例子: 代码:#include&amp;lt;stdlib.h&amp;gt;#include&amp;lt;assert.h&amp;gt;#include&amp;lt;string.h&amp;gt;原创 2018-08-17 21:31:39 · 5842 阅读 · 3 评论 -
括号匹配问题(栈的应用)
栈: 栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除等操作。 没有任何元素的栈称为空栈。 栈又称为 后进先出 的线性表。 括号匹配问题: 算法思路: 一个关于括号匹配的例子: 封装一个静态栈: #define Max 20#define DataType char typedef struct Stack{ DataType...原创 2018-08-17 18:10:34 · 818 阅读 · 0 评论 -
c 操作符
算术操作符 + - * / %(取模) / 左右操作数都为整数,执行整数除法,只要有一个是浮点数,执行的是浮点型除法。1/2=0, 1.0/2=0.5举一个例子:#include<stdio.h>#include<stdlib.h>int main(){ int a = 1; double b = 2...原创 2018-03-25 15:59:27 · 187 阅读 · 1 评论