
C语言
One Piece&
这个作者很懒,什么都没留下…
展开
-
字节对齐简介
什么是字节对齐:为了使CPU能够对变量进行快速的访问,变量的起始地址应该具有某些特性,即所谓的”对齐”,比如4字节的int型,其起始地址应该位于4字节的边界上,即起始地址能够被4整除,也即对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004(为4的倍数),那它就是自然对齐的,而如果其地址为0x00000002(非4的倍数)则是非对齐的。 现代计算机中内存空间都是按照byte划分的,从理论上讲原创 2020-12-18 18:53:17 · 279 阅读 · 1 评论 -
C语言--指针快速入门 (附测试程序)
列举几个例子,帮助快速入门指针:首先,我们将内存空间简化成是一个一个的小格子,每个格子都有一个序号(内存地址)原则:只要是变量,就一定占格子;只要是指针变量,就一定占4个格子。例子1、定义三个类型的变量:char c;int a;(int *) p;int **pp;则有:&c = 100; 格子的序号对应的就是变量c的地址。&a = 200; int类型的变量,他的地址就是第一个格子做对应的格子的地址。&p = 204; 指针变量在编译的过程中,要原创 2020-08-23 14:45:43 · 300 阅读 · 0 评论 -
二叉搜树的后续遍历序列
#include <stdio.h>#include <stdbool.h>#include <stdlib.h>/*分析一个二叉搜树的后续遍历的规律:最后一个元素为二叉搜索树的跟节点:树组从左往右查,小于最后一个元素的都是左子树:(直到找到大于最后一个元素的值,说明左子树访问完毕)其他的,都是右子树....其他节点,也用同样的方式进行判断*//*参数:输入数组参数:数组元素个数*/bool IsSequence(int seq[],int l原创 2020-09-18 18:17:28 · 112 阅读 · 0 评论 -
树的子结构
#include <stdio.h>#include <stdlib.h>/* 树的子结构 *//*先在A树中找到和B树根节点相同的节点 接着,在依次判断*/typedef struct TreeNode{ int data; struct TreeNode *LeftNode; struct TreeNode *RightNode;}TreeNode;/*往树中插入数据(常规方法) 创建搜索树 并返回根节点*//*涉及到头结点原创 2020-09-17 19:22:33 · 91 阅读 · 0 评论 -
给定一个节点,按中序遍历顺序输出二叉树的下一个节点 (C语言)
#include <stdio.h>#include <stdlib.h>/*搜索二叉树 结构体*/typedef struct TreeNode{ int data; struct TreeNode *LeftNode; struct TreeNode *RightNode; /*找下一个节点的时候用*/ struct TreeNode *ParentNode;}TreeNode;/*中序遍历*/void MidSearch(原创 2020-09-14 20:02:59 · 522 阅读 · 0 评论 -
搜索二叉树 递归创建和非递归创建
#include <stdio.h>#include <stdlib.h>/*创建一颗 搜索二叉树 结构体*/typedef struct TreeNode{ int data; struct TreeNode *leftTree; struct TreeNode *rightTree;}TreeNode;/*中序递归遍历*/ /* 递归的本质是压栈 */void mid_travel(TreeNode *Node){ if(原创 2020-09-14 16:24:22 · 191 阅读 · 0 评论 -
二叉树的镜像 (C语言)
#include <stdio.h>#include <stdlib.h>/*二叉树的镜像 利用递归的思想实现*//*树的结构体*/typedef struct Tree{ int data; struct Tree *LeftTree; struct Tree *RightTree;}Tree;/*序列结构体*/typedef struct List{ int data[10]; int size;}List;/*重原创 2020-09-13 16:45:55 · 1016 阅读 · 0 评论 -
重建二叉树并输出二叉树的深度 (C语言)
#include <stdio.h>#include <stdlib.h>/*树的结构体*/typedef struct Tree{ int data; struct Tree *LeftTree; struct Tree *RightTree;}Tree;/*序列结构体*/typedef struct List{ int data[10]; int size;}List;/*重建二叉树 根据 前序序列 和 中序序列 */原创 2020-09-13 11:27:30 · 411 阅读 · 0 评论 -
重建二叉树 (C语言)
#include <stdio.h>#include <stdlib.h>/*二叉树结构体*/typedef struct Tree{ int data; struct Tree *leftTree; struct Tree *rightTree;}Tree;/*序列结构体*/typedef struct List{ int data[10]; int size;}List;/*返回值:重建的二叉树的根节点参数:前序序列结原创 2020-09-13 10:11:38 · 1653 阅读 · 1 评论 -
二叉树中和为某一值的路径
#include <stdio.h>#include <stdlib.h>/*二叉树中和为某一值的路径*//*深度优先搜索思想*//*创建一个栈 和 一颗二叉树*//*栈结构体*/typedef struct Stack{ int top; /*游标*/ int *space;/*栈空间*/ int len;/*分配栈空间,以及判断栈是否满*/}Stack;/*对栈进行初始化*/void InitStack(Stack *head,in原创 2020-09-18 21:08:32 · 132 阅读 · 0 评论 -
从上往下打印二叉树
#include <stdio.h>#include <stdlib.h>/*从上往下打印二叉树*//*队列的应用每次打印节点以后,都要将他的左孩子和右孩子添加进去;依次类推,直到为空*//*队列结构体*/typedef struct Queue{ int *space; /*队列的空间*/ int len; /*队列的长度*/ int rear; /*队尾 允许插入的一端(入队)*/ int front;原创 2020-09-18 16:06:23 · 113 阅读 · 0 评论 -
顺时针打印矩阵
#include <stdio.h>#include<assert.h>/*顺时针打印矩阵*//*步骤: * 1、确定打几圈,有行或列中,小的那个决定 int i=(n+1)/2 * 2、写每一圈的打印逻辑*/#define N 3 /*N==col*//*打印一圈的逻辑*//*row:行 col:列time:用来记录打印了几圈*//*打印每一圈的逻辑*/void printMatrix(int (*str)[N],int row,int col原创 2020-09-18 09:35:31 · 78 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
#include <stdio.h>#include <string.h>/*调整数组顺序,使奇数在偶数前面*/void Exchange(int str[],int len){ int i; int j=0,k=0; int tep[10]={0}; int data[10]={0}; for(i=0;i<len;i++) { if(str[i]%2==1) data[j++] =原创 2020-09-17 15:57:19 · 73 阅读 · 0 评论 -
二进制中1的个数
#include <stdio.h>/*输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示*//*将10进制转成2进制*/void returnData(int data,char str[],int num,int count){ if(count == num) return ; str[count] = (data &(1<<(num-1-count)))==0?'0':'1'; returnData(data,st原创 2020-09-17 14:14:45 · 92 阅读 · 0 评论 -
矩形覆盖--斐波那契数列的应用
#include <stdio.h>/*递归思想,动态规划--》斐波那契数列*//*矩形覆盖*//*n=0: 0n=1: 1n=2: 2n>2:f(n-1)+f(n-2)*/int Fdata(int data){ if(data<=2) return data; else return Fdata(data-1)+Fdata(data-2);}int main(void){ printf("me原创 2020-09-17 12:52:39 · 104 阅读 · 0 评论 -
跳台阶 (C语言)
在这里插入代码片#include <stdio.h>/*跳台阶 一次跳一阶或者两阶(动态规划思想)---》和斐波那契一样(除了第二项) * 那么:每一阶的跳法都是前两阶跳法的 和 !*//* 1阶:1 2阶:2 3阶:3 4阶:5 */int Jump(int data){ if(data<=2) return data; else return Jump(data-1)+Jump(data-2);}int原创 2020-09-16 22:35:47 · 1002 阅读 · 0 评论 -
变态青蛙跳(C语言)
#include <stdio.h>/*变态跳台阶 一次跳一阶、两阶到n阶(动态规划思想) * 那么:每一阶的跳法都是前n阶跳法的 和 !*//*0阶:11阶:12阶:2*f(n-1)数学表达式:2^(n-1)*/int Jump(int data){ if(data<=1) return data; else return 2*Jump(data-1);}int main(void){ printf("原创 2020-09-16 22:34:55 · 378 阅读 · 0 评论 -
斐波那契数列 (C语言)
#include <stdio.h>/*斐波那契数列 从第三项开始,每一项都是前两项的和*/int Fdata(int data){ /* 0 1 1 */ if(data<=2) return 1; /*从第三项开始,每一项都是前两项的和*/ return Fdata(data-1)+Fdata(data-2);}int main(void){ int n; n = Fdata(9); printf(原创 2020-09-16 21:46:12 · 293 阅读 · 0 评论 -
旋转数组的最小数字 (C语言)
#include <stdio.h>/*旋转数组的最小数字*//*思路分析:原先,数组是一个升序数组,第一个元素是最小的。经过旋转以后,一个升序数组变成两个升序数组,且第二个升序数组的第一个元素是整个数组中,最小的;第一段有序序列的最大值,是数组中,最大的。有一个特殊的情况:就是第一段的末尾元素等于第二段的末尾元素,这时 ,可以将独二段最右面的那个指针左移一位,继续比较实现方法:定义两个指针(指向头尾),如果这两个指针的中间指针大于右边指针,说明中间指针的前面一定不是第二原创 2020-09-16 20:55:04 · 282 阅读 · 0 评论 -
链表的逆序输出 (C语言)
#include <stdio.h>#include <stdlib.h>/*链表结构体*/typedef struct List{ int data; struct List *next;}List;/*创建链表 插入数据*/List * creatList(List *head,int data){ if(head == NULL) { /*创建头结点*/ head = (List*)malloc(原创 2020-09-16 17:38:33 · 924 阅读 · 0 评论 -
二维数组的查找(C语言)
#include <stdio.h>#include <stdlib.h>#include <stdbool.h>/*分析特性,得到规律如下:要查找的数值如果比右上角的值大,那么它将大于整个行;要查找的数值比如果右上角的值小,那么它将小于整个列。如果相等的话,查找就结束了*//* * 参数1:矩阵数组 * 参数2:行 * 参数3:列 * 参数4:要查找的元素*/bool Find(int* matrix, int rows, int colum原创 2020-09-16 16:52:44 · 1203 阅读 · 1 评论 -
替换空格
#include <stdio.h>#include <string.h>/*str是传入传出参数*/void Replace(char *str){ int i=0; /*用于表示数组对应的位*/ int blockNum = 0; /*空格的个数*/ int trueSize = 0;/*数组的上实际长度*/ int newSize = 0; /*空格被替换以后,数组的实际长度*/ if(str == NULL)原创 2020-09-16 16:51:35 · 84 阅读 · 0 评论 -
输入任意整数,返回整数的位数和各数字出现的次数
#include <stdio.h>int main (){int num=0;int tep=0;/存放临时取余的结果/int div;/存放临时除法的结果/int data[10]={0}; /存放 0-9 出现的次数/int j=0;/用来遍历数组的元素,输出对应元素的出现次数/int sum=0; /记录输入的数有几位/printf(“Please enter the number:”);scanf("%d",&num);/兼容正负号/if(num<原创 2020-09-15 17:42:51 · 431 阅读 · 0 评论 -
任意位宽的补码转原码,原码转补码
基础知识:对于正数正数:原码=反码=补码对于负数:原码->补码 和 补码->原码 的规律一样,都是 “取反加1”eg:以 -3 为例(前面的1,是符号位,0为正,1为负。不参与运算)原码->补码:111(原码)=100(反码)=101(补码)补码->原码:101(补码)->110->111(原码)#define BitNum 8 /*实现的是32位的转化*/#define DateType int/*参数:num:原创 2020-09-15 16:20:05 · 568 阅读 · 0 评论 -
C语言常见位操作编程题
1 给出一个字节中被置为1的位的个数相关知识点:& (按位与) :相同位都是1,则为1.如果有一个不为1,则为0 (有0出0)| (按位或) :相同位只要有一个为1,则为1 (有1出1)~(按位取反):每一位0变1,1变0^(按位异或):相同位不同,则为1;相同,则为0 (同死(0)异生(1))右 移:右移一位,相当于除2,并且取整左 移:左移一位,相当于乘2在这里插入代码片int原创 2020-09-15 14:59:34 · 609 阅读 · 0 评论