C语言
刘小小小小刘
https://liuziqiao.github.io/
展开
-
C语言二次学习
我是一名大二的计算机本科生,刚来到大学,对学习一门语言抱着极大的兴趣,今天想学习这个语言,明天想学那个语言,经过大一大二快两年的折腾,终于对自己有了新的认识,虽然大一学习过了C语言,又接着自学了一点java,就感觉自己很厉害的样子了,其实不然,在对自己的未来就业考虑了许久之后对自己重新下了个定义,发现自己其实一直很水,C语言学的简直一塌糊涂,因为在未来的就业找工作时面临面试时会考到算法,通过已经毕原创 2018-04-18 00:45:19 · 478 阅读 · 1 评论 -
strncpy、strncat、strncmp的模拟实现
模拟实现strncpy、strncat、strncmp,相比于strcpy、strcat、strcmp来说,strncpy、strncat、strncmp三个函数只是加了一个字母n来控制拷贝、连接、比较的个数1、strncpy的实现#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include <assert.h&g...原创 2018-06-25 19:25:40 · 457 阅读 · 1 评论 -
选择排序法
选择法排序:每次选择所要排序的数组中的最大值(由小到大排序则选择最小值)的数组元素,将这个数组元素的值与最前面没有进行排序的数组元素的值互换。以数字9、6、15、4、2为例,采用选择法实现数字按从小到大进行排序,每次交换的顺序如图所示。从图可以发现,在第一次排序过程中将第一个数字和最小的数字进行了位置互换;而第二次排序过程中,将第二个数字和剩下的数字中最小的数字进行了位置互换;依此类推,每...原创 2018-07-23 19:28:59 · 2552 阅读 · 0 评论 -
模拟实现 strstr
#include <stdio.h>#include <assert.h>char* my_strstr(const char* str1,const char* str2){const char *start = str1;const char *substr = str2;const char *cur = str1;assert(str1 != NU...原创 2018-07-12 13:08:30 · 321 阅读 · 1 评论 -
结构体(位段)、枚举、联合
结构体的声明在声明一个结构体时,需要将他所有的成员列举出来,成员包括类型,成员名。例如:struct tag//结构体标签{member-list;//成员列表:可以是标量、数组、指针甚至是其他结构}variable-list;//变量列表当然,也有一些特殊的声明方式,比如不完整声明struct{ int a; char b; float c;}x;struct...原创 2018-07-13 10:35:35 · 401 阅读 · 0 评论 -
二分查找(折半查找)
二分查找又称折半查找,它是一种效率较高的查找方法。 二分查找要求:线性表是有序表,即表中结点按关键字有序,并且要用向量作为表的存储结构。不妨设有序表是递增有序的。 二分查找的基本思想是: 设R[low..high]是当前的查找区间 (1)首先确定该区间的中点位置: (2)然后将待查的K值与R[mid].key比较:...原创 2018-07-29 08:28:47 · 673 阅读 · 0 评论 -
冒泡排序
冒泡排序(Bubble Sort)冒泡排序是一种极其简单的排序算法,也是我所学的第一个排序算法。它重复地走访过要排序的元素,依次比较相邻两个元素,如果他们的顺序错误就把他们调换过来,直到没有元素再需要交换,排序完成。这个算法的名字由来是因为越小(或越大)的元素会经由交换慢慢“浮”到数列的顶端。冒泡排序算法的运作如下: 比较相邻的元素,如果前一个比后一个大,就把它们两个调换位置。 ...原创 2018-08-01 19:21:34 · 271 阅读 · 0 评论 -
C语言实现通讯录
实现一个通讯录我们利用realloc动态内存开辟来实现通讯录,这样就可以存储无数个人的信息,每个人的信息包括: 姓名、性别、年龄、电话、住址提供功能:1.增加联系人2.删除联系人3.修改联系人4.查找联系人5.显示联系人6.排序联系人7.清空联系人8.以文件保存思路分析:首先我们可以分三个模块来解决这个问题,第一个模块我们需要一个头文件,这个头文件...原创 2018-08-11 09:30:55 · 14465 阅读 · 1 评论 -
二叉树基本操作下
二叉树进阶将三种递归遍历改写成非递归遍历形式头文件引用#pragma once/*二叉树的遍历非递归、层序遍历、是否是完全二叉树*/#include "BTree.h" #include "Stack.h" //递归遍历用stack完成#include "Queue.h" //层序遍历用queue完成先序遍历void preOrderTraverse(...原创 2018-08-26 23:57:48 · 163 阅读 · 0 评论 -
栈实现括号匹配
栈实现括号匹配匹配思想:从左至右扫描一个字符串(或表达式),则每个右括号将与最近遇到的那个左括号相匹配。则可以在从左至右扫描过程中把所遇到的左括号存放到堆栈中。每当遇到一个右括号时,就将它与栈顶的左括号(如果存在)相匹配,同时从栈顶删除该左括号。算法思想:设置一个栈,当读到左括号时,左括号进栈。当读到右括号时,则从栈中弹出一个元素,与读到的左括号进行匹配,若匹配成功,继续读入;否则匹配失败,返...原创 2018-08-23 08:35:13 · 12936 阅读 · 0 评论 -
判断元素入栈出栈的合法性
判断元素入栈出栈的合法性一般来说,这种判断性的问题会出现在一些面试题目的选择题中,当然学习了栈之后,我们就要有解决这种问题的能力。思路: 判断元素是否相同,相同就进行下一个元素比较,当栈不为空并且栈顶元素和输出的栈元素相同,则将该元素出栈并指向输出元素的下一个,否则就将该元素进栈,并指向比较的元素的下一个 ,直到所有元素比较完然后按出栈顺序进行比较,当栈不为空时,将栈顶元素与当前元素进行比较...原创 2018-08-23 17:24:19 · 541 阅读 · 0 评论 -
复杂链表的复制
复制链表的复制在复杂链表中,每个结点除了有一个next指针指向下一个结点之外,还有一个random指向链表中的任意结点或者NULL。结点定义如下typedef struct Link_C{ int data; struct Link_C *next; struct Link_C *random;}Link_C;思路:(我们分三步骤)第一步:复制结点...原创 2018-08-24 08:48:29 · 163 阅读 · 0 评论 -
二叉堆
堆的概念 如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元 素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足: Ki <= K2i+1 且 Ki<= K2i+2 (Ki >= K2i+1 且 Ki >= K2i+2) i = 0,1,2…,则称为小堆(或大堆)。 小堆(大堆)中:任一结点的关键码均小于(大于)等于它的左...原创 2018-08-28 22:42:33 · 119 阅读 · 0 评论 -
二叉搜索树
二叉搜索树概念二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的左右子树也分别为二叉搜索树二叉搜索树操作头文件定义typedef int DataType;typedef struct BSTreeNode{ DataTyp...原创 2018-08-31 22:48:16 · 144 阅读 · 0 评论 -
二叉树基本操作上
二叉树的概念一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵分别称为左子树和右子树的二叉树组成二叉树特点:每个结点最多有两棵子树,即二叉树不存在度大于2的结点 二叉树的子树有左右之分,其子树的次序不能颠倒因此:二叉树是通过上述形式的组合或嵌套而形成满二叉树&完全二叉树满二叉树:在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子节...原创 2018-08-25 22:01:18 · 365 阅读 · 0 评论 -
模拟实现qsort函数
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int my_cmp(const void* p1,const void* p2){ return *(int*)p1 - *(int*)p2;}void my_swap(void* p1,void* p2,int size){ int i = 0; for (...原创 2018-06-20 23:06:24 · 347 阅读 · 0 评论 -
指针深度理解
指针数组 一个数组,若其元素均为指针类型数据,称为指针数组。 也就是说,指针数组中每一个元素都相当于一个指针变量。其详细形式应该如下: *a[0], ...*a[n]. 每一个数组里面存储的是其指向的地址;一维指针数组的定义形式为:类型名 *数组名[数组长度]例如:int *p[4],由于[]比*优先级更高,因此p先与[4]结合,形成p[4]的形式,这显然是数组形式。然后再与p前面的*结合,*表示...原创 2018-06-18 21:21:24 · 382 阅读 · 0 评论 -
C语言求第n个斐波那契数。
用递归和非递归求第n个#include <stdio.h>int fib1(int num){if (num <= 2){return 1;}else{return fib(num-1)+fib(num-2);}} int fib2(int num ){int a = 1;int b = 1;int c = 0;while (num-2>...原创 2018-06-17 17:51:37 · 1262 阅读 · 9 评论 -
数组的初始化、清空、逆置
创建一个数组, 实现函数init()初始化数组、 实现empty()清空数组、 实现reverse()函数完成数组元素的逆置。 要求:自己设计函数的参数,返回值。 void init(int arr[], int size){ int i = 0; for(i=0;i<size;i++) { arr[i] = i; printf("%d ",arr[i]); } ...原创 2018-05-09 20:18:15 · 558 阅读 · 0 评论 -
求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字,例如:2+22+222+2222+22222
求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字,例如:2+22+222+2222+22222 int main() { int a = 0; int n = 0; int i = 0; int sum = 0; int tmp = 0; scanf("%d%d", &a, &n); fo...原创 2018-05-05 20:22:07 · 367 阅读 · 0 评论 -
求出0~999之间的水仙花
求0~999之间的所有“水仙花数”并输出。“水仙花数”是指一个三位数,其各位数字的立方和确好等于该数本身,如;153=1+5+3?,则153是一个“水仙花数”。 /* 首先我们先了解一下什么叫水仙花,在数论中,水仙花数(Narcissistic number)也称为自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),是指一N位数,其各个数之N次方和等于该数。 例如153、...原创 2018-04-27 23:10:25 · 840 阅读 · 0 评论 -
static关键字用法总结
一、C程序存储空间布局C程序的部分组成: 1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令; 2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量存放在这里。 3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。 4)栈——增长方向:自顶向下增长;自动变量以及每次...原创 2018-05-12 23:26:07 · 355 阅读 · 0 评论 -
数组的总结
一维数组函数的声明1、一维数组的创建及初始化2、一维数组的使用3、一维数组在内存中的存储4、指针的初步了解5、一维数组的指针访问int main(){ //1、一维数组的创建及初始化 //数组是一组相同类型元素的集合。 //数组的创建方式: //类型名 数组名 [常量]; //这里只是在C语言环境中 //数组[]里的常量不能为0,不完全的数组化初始化,缺少的补0; //数组[]中...原创 2018-05-13 10:17:21 · 875 阅读 · 0 评论 -
C语言实现扫雷小游戏
扫雷是一个非常好玩经典的小游戏,相信小时候的你一定玩过吧,今天我就详细的介绍小用C语言实现扫雷小游戏。游戏的难点在这:1>第一次下子,不炸死。 2>坐标周围没雷,可以实现展开。 首先我们理清思路:首先,定义两个二维数组,一个用来设置雷,一个展示给用户进行扫雷;初始化两个数组,我们将雷盘有雷的位置设置为‘1’,其他设置为‘0’,给用户展示的全部设置为 ‘*’,然后将两个棋盘都打印出来,方...原创 2018-05-20 10:14:45 · 1618 阅读 · 0 评论 -
操作符总结
一、操作符分类1、算数操作符2、移位操作符3、位操作符4、赋值操作符5、单目操作符6、关系操作符7、逻辑操作符8、条件操作符9、逗号表达式10、下标引用、函数调用和结构成员二、操作符具体功能(一)算数操作符+ - * / %%操作符只能用整数,其他的操作符都可以作⽤于整数和浮点数。(二)移位操作符1、左移和右移 <<>>左移:左边抛弃、右边补零2、右移有两种:(1)逻辑移...原创 2018-05-07 20:26:11 · 343 阅读 · 0 评论 -
C语言实现三子棋
首先,定义一个二维数组,这个数组用来储存玩家的棋子,在玩之前,我们初始化这个棋盘,让棋盘的每个位置为一个空格,为了棋盘的美观,我们用来分割线来画好棋子的每个位置加以区分。初始化棋盘并打印棋盘void InitBoard(char arr[ROW][COL],int row,int col){ int i = 0; int j = 0; for (i=0;i<row;i++) { ...原创 2018-05-21 20:02:38 · 461 阅读 · 0 评论 -
把奇数排在偶数前
Q:输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。 A:方法一:从数组的前后两端开始对每个数进行判断,直到判断完最中间元素后完成数组的调整,下面给出代码://方法一void Reorder(int *array,int sz){ int i=0; int j=sz-1; while(i<j) { i...原创 2018-05-27 15:48:54 · 1896 阅读 · 2 评论 -
C语言可变参数列表解析
Q: 什么是可变参数列表?A: 通过将函数实现为可变参数形式,可以使得函数可以接受一个以上的任意多个参数(不是固定的)首先我们看一个例子#include <stdio.h>#include <stdarg.h>int Avg(int n, ...){ va_list arg; int i = 0; int sum = 0; va_start(arg,n);...原创 2018-06-04 22:50:15 · 305 阅读 · 0 评论 -
栈帧细谈
一、 什么是栈帧?首先引用百度百科的经典解释:“栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。实际上,可以简单理解为:栈帧就是存储在用户栈上的(当然内核栈同样适用)每一次函数调用涉及的相关信息的记录单元。也许这样感觉更复杂了,好吧,让我们从栈开始来理解什么是栈帧...栈帧表示程序的函数调用记录,而栈帧又是记录在栈上面,很明显栈上保持了N个栈帧的实体,那就可以说栈帧将栈分割成了...原创 2018-06-05 20:23:22 · 361 阅读 · 0 评论 -
找出数组中出现一次的两个数
*1.一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字,编程实现。*/ 方法一:#include<stdio.h>int main(){ int arr[12] = {1,2,3,4,5,6,1,2,3,4,5,9}; int i = 0; int j = 0; int cnt = 0; for (i=0;i<sizeof(arr)/s...原创 2018-06-22 20:28:57 · 663 阅读 · 0 评论 -
利用可变参数模拟实现printf打印
//函数原型: //print(char *format, ...)#include <stdio.h> #include <stdarg.h> #include <assert.h> int myprintf(const char *format, ...) { va_list arg; assert(format); va_start...原创 2018-06-09 23:06:20 · 998 阅读 · 0 评论 -
哈希表(上)
哈希冲突的闭散列处理方式哈希的概念在顺序搜索以及二叉树搜索树中,元素存储的位置与元素的关键码之间没有对应的关系,因此查找一个元素时,必须要经过关键码的多次比较,搜索效率取决于搜索过程中元素的比较次数。理想的搜索方法是:可以不经过任何的比较,一次直接从中找到要搜索的元素。如果构造一种存储结构,通过某种函数使得元素的存储位置与元素的关键码之间有一一映射的关系,那么在查找过程中通过该哈希函数可...原创 2018-09-08 22:41:26 · 219 阅读 · 0 评论