c语言
文章平均质量分 59
小心眼儿猫
这个作者很懒,什么都没留下…
展开
-
BOOL、float 、指针变量与 "零值" 如何比较?
BOOL flag与 “零值” BOOL flag;//正确写法if(flag)if(!flag)//错误写法if(flag == TRUE)if(flag == 1)if(flag == FALSE)if(flag == 0)char *p与 “零值” //正确写法if(p == NULL)if(p != NULL)//错误写法if(p == 0)...原创 2018-09-09 16:12:02 · 832 阅读 · 0 评论 -
C语言实现三子棋
在源文件中创建test.c和game.c文件,头文件中创建game.h文件。代码如下。 实现三子棋程序,只要我们能够理清楚思路,就可以知道其实它的做法并不难,重点在于实际写代码时需要多关注细节。这里我们可以写完一块就可以立马运行程序检查是否如我们所想的效果出现,如若不是便可立即查错纠错。test.c#include <stdio.h>#include <stdlib.h>#include <原创 2017-12-12 17:37:44 · 201 阅读 · 0 评论 -
C语言基础知识问答
1、什么是C语言? 答:C语言是一门通用的高级计算机编程语言 。(由丹尼斯·里奇与肯·汤普逊,以B语言为基础,在贝尔实验室设计开发出来的)2、C语言有什么特点? 答: 1、C语言是一个有结构化程序设计,具有变量作用域以及递归功能的过程式语言。 2、传递参数就是以值传递,也可以传递指针。 3、不同的变数类型可以用结构体组合在一起。 4、部分变量类型可以转换,例...原创 2018-05-07 00:18:16 · 1675 阅读 · 0 评论 -
数据结构·堆
堆:堆的表现形式其实是一棵完全二叉树,只不过,该完全二叉树中的元素有一些其他的考究。 1、首先堆分为大堆和小堆 2、大堆(小堆):任一节点的关键码大于(小于)等于他的左右孩子的关键码,位于堆顶节点的关键码永远是这棵二叉树中最大(最小)的一个值,从根节点到每个节点的路径上数组元素组成的序列都是递减(递增)的 1、堆存储在下标为0开始的数组中,因此在堆中给定下标为i的点时:...原创 2018-05-12 17:08:38 · 198 阅读 · 0 评论 -
二叉树基本操作(三)(非递归实现前中后序遍历)
非递归实现前序遍历思路:非递归的前序遍历就比较简单,借助一个栈,将根节点入栈,然后通过循环,取栈顶元素,出栈就可访问当前栈顶元素(也就是当前树的根节点(前序遍历的顺序是VLR)),有先序遍历的顺序规则,在将其右子树入栈,在将其左子树入栈,只需要注意一点,左右子树的入栈顺序一定是先入栈右子树在入栈左子树。(因为我们先序遍历是访问了根节点之后就访问左子树在访问右子树,而栈的特点是后进先出,因此我们要想...原创 2018-05-06 02:06:16 · 592 阅读 · 0 评论 -
C语言动态内存管理:malloc、realloc、calloc以及free函数
我们已经掌握的内存开辟方式有: int val = 20;//在栈空间上开辟四个字节 char arr[10] = {0};//在栈空间上开辟10个字节的连续空间但是这种开辟空间的方式有两个特点: 1. 空间开辟的大小是固定的。 2. 数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配。 但是我们在实际的需求中,对于空间的需求,不仅仅是上述的情况。有时候我...原创 2018-05-17 13:54:04 · 817 阅读 · 0 评论 -
多通路带环和不带环迷宫求最短路径(C语言)
求解了简单迷宫,接下来我们来看一看多通路的带环和不带环的迷宫求最短路径的问题。 问题一:不带环的多通路迷宫求最短路径 思路: 1、给定一个点,判断该点是否能落脚,不能落脚直接返回 2、能落脚就将这个点标记,并且入栈cur_path,该栈中保存着我们走过的路径 3、判断这个点是否为出口,是出口说明找到了一条路 4、此时cur_path栈中保存着我们走过的这条路,将cur...原创 2018-04-21 22:20:55 · 541 阅读 · 0 评论 -
单链表的相关面试题(一)
以下内容接《C语言实现单链表的增删查改》有需要者自行戳链接查看 linklist.h文件新增内容//冒泡排序void linklistBubbleSort(LinkNode *head);//找出中间节点LinkNode *FindMidNode(LinkNode *head);//找倒数第K个节点LinkNode *FindLastKNode(LinkNode *head,siz...原创 2018-04-07 13:58:16 · 339 阅读 · 0 评论 -
回溯法求解简单迷宫(C语言)
前两天学习了栈和队列的相关知识,今天来看一下如何用栈来走出迷宫。 先来一个迷宫:0表示墙(不能走),1表示路(能走)为便于观察我将这里可走的路用红色标记一下 前面收到我们要使用栈的相关知识来走出这个迷宫,下面就正式开始来说一说怎么解决迷宫问题。 方法一:使用函数本身的栈。我们都知道调用一个函数时,该函数都会形成自己的函数调用栈,当函数调用结束返回以后,该栈结构就会随之消失,而这里的调用栈的原创 2018-04-21 11:19:07 · 4196 阅读 · 0 评论 -
哈希表的基本操作(一):线性探测法解决哈希冲突
哈希概念 在之前学习过的顺序搜索和二叉树搜索中,元素存储位置和元素各关键码之间没有对应关系,因此在查找一个元素时,必须要经过关键码的多次比较。搜索的效率取决于搜索过程中元素的比较次数。 我们希望可以不经过任何比较,一次直接从表中得到想要的元素,这样一来,搜索效率就有了质的提高。如果构造一种存储结构,通过某种函数是元素的存储位置与他的关键码之间能够建立一一映射的关系,那么在查找的时候通...原创 2018-05-20 18:22:27 · 33733 阅读 · 2 评论 -
哈希表的基本操作(二):哈希桶处理哈希冲突
哈希桶//hash.h文件内容#pragma once#define max_size 1000typedef int KeyType;typedef int ValType;typedef int (*HashFunc)(KeyType key);typedef struct HashElem{ KeyType key; ValType value; ...原创 2018-05-20 18:26:31 · 1463 阅读 · 0 评论 -
自定义类型(一):结构体和位段
结构体:是一些值的集合,这些值称为成员变量,每一个成员可以是不同类型的变量。结构体的声明:struct tag{ member_list;}variable_list;//例如使用结构体来描述一个学生struct Stu{ char name[20];//名字 int age;//年龄 char id[20];//学号};//分号不不能丢...原创 2018-05-22 08:26:02 · 1085 阅读 · 0 评论 -
野指针的产生及其危害
深是原创 2018-08-17 00:00:47 · 9792 阅读 · 0 评论 -
模拟实现memcpy、memmove
模拟实现memcpyvoid *my_memcpy(void *dst,const void *src,int count){ assert(dst); assert(src); char *p = (char *)dst; char *q = (char *)src; while(count--) { *p = *q; ...原创 2018-08-19 16:25:51 · 187 阅读 · 0 评论 -
模拟实现strcpy、strcat、strstr、strtcmp
模拟实现strcpy:字符串拷贝char *my_strcpy(char *dst,const char *src){ assert(dst); assert(src); char *ret = dst; while(*dst &amp;amp;&amp;amp; *src) { *dst = *src; dst++; ...原创 2018-08-19 15:58:51 · 268 阅读 · 0 评论 -
模拟实现atoi、itoa
模拟实现atoiint my_atoi(const char *str){ assert(str); int res = 0;//保存结果 int sign = 1;//符号标志 char *p = (char *)str; while(*p != '\0') { while(*p == ' ') { ...原创 2018-08-19 14:15:48 · 206 阅读 · 0 评论 -
三种方法实现strlen
方法1:计数法int my_strlen(const char *str){ char *p = (char*)str; int count = 0; while(*p != '\0') { count++; p++; } return count;}方法2:递归法int my_strlen(const...原创 2018-08-19 13:47:09 · 246 阅读 · 0 评论 -
排序算法:冒泡,选择,插入,希尔以及堆排序
冒泡排序:时间复杂度O(N^2),空间复杂度O(1),稳定排序 这里的我们使用冒泡排序对数据升序排序,从后往前冒,每冒完一趟我们都会找到这一堆数据(待排序的数据)中最小的一个,并且该最小的数据就在待排序的数据中第一个位置上,此时我们修改有序的区间,再进行下一趟的冒泡排序,并且已经被排好的数据就不会二次被进行排序(二次排序是不必要的,这里就是借用一个有序区间避免了这种不必要)。#inclu...原创 2018-05-30 17:05:55 · 289 阅读 · 0 评论 -
自定义类型(二):枚举和联合
枚举:顾名思义就是一一列举 比如在我们的日常生活中,一个星期有7天,一年有12个月等等都可以使用枚举来一一列举表示。 枚举类型的定义://例1enum sex{ male, //注意逗号 female, secret //注意最后一个成员末尾没有逗号}//例2enum Color{ red, //注意逗号 green, ...原创 2018-05-22 21:44:08 · 258 阅读 · 0 评论 -
排序算法:快速排序和归并排序
快速排序(升序排序):快速排序的核心就是找到一个基准值(我们这里采用最后一个元素作为基准值),然后在剩下的区间里从左往右找到一个大于基准值的数,再从右往左找到一个小于基准值的数然后将二者交换,直到二者相遇一趟排序结束。然后在继续下一趟排序。 //////////////////////////////////////快速排序的递归版本/////////////////////////...原创 2018-06-03 11:37:57 · 488 阅读 · 0 评论 -
单链表的相关面试题(二)
单链表的基础操作:单链表的相关面试题(一) 之前介绍了单链表的基础的增删查改的先关操作,详细信息请戳上文链接查看文章。 接下来我们来解决一些常见的单链表的相关面试题。 linklist.h文件#pragma once#include<stddef.h>typedef char LinkType;typedef struct LinkNode{ Lin...原创 2018-05-02 08:12:03 · 188 阅读 · 0 评论 -
C语言实现链式队列
C语言实现基于顺序表的顺序队列 linkqueue.h文件#pragma oncetypedef char linkType;typedef struct linkNode{ linkType data; struct linkNode *next;}linkNode;//初始化函数void linkQueueInit(linkNode **qhead);...原创 2018-04-14 09:12:53 · 2011 阅读 · 1 评论 -
C语言实现基于链表的链式栈
C语言实现基于顺序表的顺序栈 代码实现: linkStack.h文件#pragma once#include<stddef.h>typedef char linkType;typedef struct linkNode{ linkType data; struct linkNode *next;}linkNode;linkNode *stac...原创 2018-04-13 22:48:51 · 231 阅读 · 0 评论 -
C语言实现单链表的增删查改
链表:一种链式存储的线性表,用一组地址任意的存储单元存放线性表的数据元素,称存储单元为一个节点。 链表分类:单链表双链表双向循环链表代码实现单链表的增删查改: linklist.h文件#pragma once#include<stddef.h>typedef char LType;typedef struct LinkNode{ //数据...原创 2018-03-25 15:23:06 · 17654 阅读 · 0 评论 -
顺序表的增删查改(二)
顺序表的增删查改(二)原创 2018-03-19 16:00:11 · 211 阅读 · 0 评论 -
进程的创建
进程的创建 提到进程创建,我们就需要来认识一下 fork()函数。 fork()从一个已经存在的进程中创建一个新的进程。新进程为子进程,而原进程为父进程。 如果fork()函数调用出错则会返回-1,否则子进程返回0,而父进程返回的是子进程的ID。 调用fork()函数以后,当控制转移到内核中的fork()代码以后,内核会进行以下几项工作:分配新的内存块和内核数据结构给子进程将父进程部...原创 2018-03-22 22:46:18 · 197 阅读 · 0 评论 -
popen函数 / system函数 / fork函数
popen() 函数函数定义:FILE* popen ( const char* command , const char* type );int pclose ( FILE* stream );函数说明: 通过创建一个管道,调用 fork 产生一个子进程,执行一个 shell 以运行命令来开启一个进程。这个进程必须由 pclose() 函数关闭,而不是 fclose() 函数。...原创 2018-03-22 21:42:01 · 234 阅读 · 0 评论 -
僵尸进程与孤儿进程
僵尸进程 与孤儿进程原创 2018-03-18 17:11:00 · 642 阅读 · 0 评论 -
进程调度
进程调度,进程调度的作用,进程调度算法原创 2018-03-17 22:30:28 · 610 阅读 · 0 评论 -
指针数组?数组指针??……
指针数组什么是指针数组呢?到底是指针还是数组呢??首先我们要明确一点,指针数组是数组而不是指针。这种数组与我们之前见的数组没什么两样,之所以叫他指针数组只是因为这个数组里的元素是指针。下面我们来举例辨析:1:int *arr1[100];2:char *arr2[100];3:char **arr[100];首先我们都能一眼知道int和char是整型和字符型,其次,我们要想知道到哪一个是指针数组...原创 2018-03-09 16:38:48 · 128 阅读 · 0 评论 -
顺序表的增删查改(一)
顺序表所谓线性表,就是n个数据元素组成的一个有限序列,可以在其任意位置上进行插入和删除操作的线性数据结构。从数据在物理内存存储形式上线性表可分为顺序表和链表。今天我们了解一下顺序表,顺序表就是用一段地址连续的存储单元依次存储数据元素的线性结构。地址连续的存储空间,我们通常会用数组,数组有静态数组和动态数组之分,所以说顺序表也有静态顺序表和动态顺序表之分,我们就先看一看静态顺序表的增删查改的操作。具...原创 2018-03-15 11:47:16 · 866 阅读 · 0 评论 -
C语言实现顺序栈
栈:是一种特殊的线性表,我们只能对栈 的固定的一端进行插入和删除元素操作。这固定的一端被称之为栈顶,另外一端就叫做栈底。如果一个栈中没有任何元素就将其称为空栈。 特性:先进后出(后进先出) seqstack.h文件#pragma once#include<stddef.h>typedef char seqStackType;typedef struct se...原创 2018-04-07 23:10:50 · 6177 阅读 · 1 评论 -
C语言实现基于顺序表的队列
队列:有且仅有三种操作:入队列,出队列,取队首元素。 只允许从一端进行插入数据操作(入队列),从另一端进行删除数据操作(出队列)或者取队首元素操作。进行插入操作的这一端叫做队尾,进行删除操作的这一端叫做队首。 特点:先进先出代码实现:seqQueue.h文件#pragma once#define Max_Size 100typedef char QueueType;typedef struct原创 2018-04-10 01:21:20 · 590 阅读 · 0 评论 -
实现一个栈:取栈中的最小值的时间复杂度为O(1)
思路:每次入栈前先找到最小的元素(每次有新元素入栈时就将新的元素假设为最小的元素min)(情况1:入栈时,栈内没有任何元素,即是一个空栈。这时候先将要入栈的元素入栈,再紧接着将最小的元素入栈;*情况2*:入栈时栈内已经有元素了,这时候将最小值min与栈顶元素相比较,如果栈顶元素比最小值还要小,则将其赋值给最小值min(min永远是最小的值)。然后先将要入栈的元素入栈再紧接着将最小值入栈。)如此一来...原创 2018-04-15 15:27:56 · 1808 阅读 · 0 评论 -
C语言·数组知识小结
在C语言中我们经常用到数组,这其中有很多我们需要了解并且注意的地方。以下是我学习数组之后的一个简单总结。 这里我们详细说明一维数组和二维数组的相关知识。一维数组一维数组的创建 数组是一组相同类型元素的集合。数组的创建方式: type_t arr_name [const_n]; 例如:int arr[100];或者 char arr[100]等,但像i...原创 2018-04-30 15:58:22 · 338 阅读 · 0 评论 -
C语言·操作符小结
C语言中操作符分为以下几类:算术操作符:+ - * / % 1.除了%操作符之外,其他的几个操作符可以作用于整数和浮点数。 2.对于/操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。 3.%操作符的两个操作数必须为整数。返回的是整除之后的余数。移位操作符:<< >> 1、 <&...原创 2018-04-30 15:17:56 · 121 阅读 · 0 评论 -
判断元素出栈入栈顺序的合法性(C语言)
题意:假设有字符串1**abcde**和字符串2**bceda**,试判断是否能以字符串1的入栈顺序得到字符串2的出栈顺序。思路: 步骤1:先将字符串1的第一个字符入栈: 步骤2:将该元素与字符串2的下一个元素进行比较 步骤3: a):如果相等,就将该元素出栈并且将字符串1的下一个字符入栈,与字符串2的下一个字符进行比较。 b):如果不相等,继续将字符串1的...原创 2018-04-17 20:43:50 · 6009 阅读 · 0 评论 -
通过一个数组实现两个栈(C语言)
通过一个数组实现的两个栈也叫作共享栈。我们可以将一个数组一分为二,供两个栈使用。 也有另外一种虽然也是讲一个数组一分为二供两个栈使用,但在具体实现上有所不同。 牢记栈1的区间是[0,top1)的左闭右开区间,栈2的区间是[top2,max_size)的左闭右开区间。其中的top1位置并不存放栈1的值,而max_size是数组的边界值也取不到。 正式由于两个栈的区间的取值,所以当top1与...原创 2018-04-17 20:06:01 · 2546 阅读 · 0 评论 -
通过两个队列实现一个栈(C语言)
stackBy2Queue.h文件#pragma once#define max_size 1000typedef char DataType;typedef struct Queue{ DataType data[max_size]; int head; int tail; //队列中有效元素个数 int size;}Queue;...原创 2018-04-16 23:42:01 · 9691 阅读 · 1 评论 -
C语言实现双向链表的增删查改
定义一个带头节点的双向链表需要一个数据域两个指针域,其中一个next指针是指向当前节点的下一个节点,另外一个prev指针是指向当前节点的前一个节点。如下图所示: 该头结点本质上只是一个傀儡节点并无实际用处,带头节点的好处就是我们在实际操作链表时不用考虑头指针的指向。而双向链表的前后指针域也大大方便了我们对于链表的实际操作。 代码示例: DBlinklist.h文件#pragma ...原创 2018-04-03 22:35:04 · 3523 阅读 · 2 评论