笔记
我是菜小白
这个作者很懒,什么都没留下…
展开
-
二叉树线索化
以中序二叉树为例,中序二叉树声明节点的结构体如下中序线索二叉树需要两类指针,指向左孩子、右孩子的指针,指向前驱和后继的指针,我们需要区分开它们,所以我们需要一个这样的结构体:1)如果ltag=0;则lchild为指针,指向左孩子,如果ltag=1,则lchild为线索,指向节点的直接前驱。2)如果rtag=0;则rchild为指针,指向右孩子,如果rtag=1,则rchild为线索,指向节点的直接后继。思考:显然,我们需要寻找节点的空指针,lchild的指向前驱,rchild指向后继。显然,我们需要在原创 2022-07-03 16:44:55 · 324 阅读 · 1 评论 -
递归算法——求n个不同字符的所有全排序列
**算法描述:**设str是含有n个不同字符的字符串,perm(str,k-1,n)为str[0] ~ str[k-1]的所有的字符的全排序列,perm(str,k,n)为str[0] ~ str[k]的全排列,对于str[k]位置,可以取str[0] ~ str[k]范围内的任何值,再组合perm(str,k-1,n)得到的全排列则得perm(str,k,n)。以上是书本上的描述,下面给它稍微解释一下。算法的核心思想是,遍历n个不同字符的序列每次挑出不同的元素保持在末尾不动,计算其他的全排列。这样依次原创 2022-04-30 21:07:03 · 1332 阅读 · 1 评论 -
编写链表的产生的问题
问题描述:结构体定义结构体指针变量"L"即一个结点,“L”指向第一个结点首地址。定义一个创建函数来创 建链表。而使用“L”时,需要将“L”初始化,即将“L”传入创建函数之前需要初始化“L”,或者直接调用 “L”的地址即“&L”。下方采用的就是第二种方式,功能函数采用“双重指针”(ListL或struct LinkList**L)定义形参来接收传入函数的“L”的地址,然后再进行其他操作。这种方式避免了“L”的初始化。(typedef struct LinkList List)#include&原创 2022-02-04 20:18:31 · 683 阅读 · 0 评论 -
结构体里不能开辟空间2021-08-12
代码如下://1)一个景区根据游人的年龄收取不同价格的门票。//2)请编写游人结构体(Visitor),根据年龄段决定能够购买的门票价格并输出//3)规则:年龄>18,门票为20元,其他情况免费//4)可以循环从控制台输入名字和年龄,打印门票收费情况,如果名字输入 n,则退出程序#include<stdio.h>#include<string.h>#include<stdlib.h>struct Visitor{ char name[20]原创 2021-08-12 09:54:54 · 197 阅读 · 0 评论 -
动态内存分配2021-08-11
动态内存分配C程序中,不同数据在内存中分配说明:1)全局变量——内存中的静态存储区2)非静态的局部变量——内存中的动态存储区——stack 栈3)临时使用的数据——建立动态内存分配区域,需要时随时开辟,不需要时及时释放——heap 堆4)根据需要向系统申请所需要大小的空间,由于未在声明部分定义其为变量或者数组,不能通过变量名或者数据名来引用这些数据,只能通过指针来引用内存动态分配的相关函数1)头文件 #include<stdlib.h> 声明了四个关于内存动态分配的函数2)原创 2021-08-11 10:02:34 · 275 阅读 · 0 评论 -
指针综合2021-8-11
指针数组基本介绍要让数组的元素 指向 int 或其他数据类型的地址(指针)。可以使用指针数组指针数组的定义数据类型 *指针数组名[大小]1)比如:int *ptr[3];2)ptr声明为一个指针数组3)由 3 个整数指针组成。因此,ptr中的每个元素,都是一个指向 int 值的指针void main(){ char* pStr = "hello word!";//定义一个字符指针指向一个字符串 char* books[] = {//定义一个指向字符的指针数组来存储字符串列表 "h原创 2021-08-11 08:10:34 · 120 阅读 · 0 评论 -
数组的退化问题
问题描述定义一个函数,以数组为形参,函数体内部求出数组大小如下:结果:无论定义多大的数组,最终函数体内输出的数组大小始终为**4*#include<stdio.h>void fun(char arr[]){//以数组为形参,一维数组作形参无需确定大小 printf("%d\n",sizeof(arr));//输出传递过来的数组的大小}void main(){ char arr[9]; printf("%d\n",sizeof(arr));//输出实参数组的大小 fun(ar原创 2021-08-06 21:57:27 · 452 阅读 · 0 评论 -
二分查找法
//通过二分查找法在一个已经排好序的数组查找值#include<stdio.h>//定义二分查找的函数(递归函数)//基本思路://1.将被查值与数组中间值相比较//2.被查值>中间值,在数组右边继续重复上述操作;被查值<中间值,在数组左边继续重复上述操作//3.直到被查值与中间值相等,输出中间值int two(int arr[],int left,int right,int scan){//参数分别为,数组、最左下标值、最右下标值(用于求出中间下标从而求出中间值)、被原创 2021-08-06 10:42:24 · 83 阅读 · 0 评论 -
C语言宏定义
C语言宏定义基本介绍1)#define 叫做宏定义命令它也是C语言预处理命令的一种,所谓宏定义,就是用一个标识符来表示一个字符串。如果在后面的代码中出现了该标识符,那么就全部替换成指定的字符串。2)#define N 100 就是宏定义,N为宏名,100是宏的内容(宏所表示的字符串)。在预处理阶段,对程序中所有出现的“宏名”,预处理器都会用宏定义中的字符串区代换,这称为“宏替换”或“宏展开”。宏定义是由源程序中的宏定义命令#define完成的,宏替换是由预处理程序完成的。宏定义的形式#defin原创 2021-08-03 11:50:28 · 52217 阅读 · 10 评论 -
金字塔与菱形
1.金字塔#include<stdio.h>void main(){ int a; printf("请输入金子塔层数:"); scanf("%d",&a);//1.最外层的for循环针对金字塔的层数,i即层数、a为金字塔最低层 for(int i=1;i<=a;i++){//2.循环体内部第一套for循环针对' '(空格)的输出。// 2*a-1为金字塔最低一层的'*'个数,2*i-1为第i层'*'个数,其差的1/2为图形每行左边的空格数。 for(int k原创 2021-07-05 20:00:22 · 328 阅读 · 0 评论 -
scanf函数中的格式字符
scanf函数中用到的格式字符格式字符说明d,i输入有符号十进制整数u输入无符号十进制整数o输入无符号八进制整数x,X输入无符号十六进制整数(大小写作用相同)c输入单个字符s输入字符串将字符串送到一个字符数组中,在输入时以非空白字符开始,以第一个空白字符结束。字符串以串结束标志‘\0’作为其最后一个字符f输入实数,可以用小数形式或指数形式输入e,E,g,G与 f 作用相同,e 与 f、g可以互相替换(大小写作用相同)l输原创 2021-07-04 21:52:39 · 2996 阅读 · 0 评论 -
switch分支结构细节
switch细节讨论1)switch 语句中的 expression 是一个常量表达式,必须是一个整型(char、short、int、long等)或枚举类型2)case 子句中的值必须是常量,而不能是变量3)default 子句是可选的,当没有匹配的 case 时,执行 default4)break 语句用来在执行完一个 case 分支后使程序跳出 switch 语句块;5)如果没有写 break,会执行下一个 case 语句块,直到遇到 break 或者执行到 switch 结尾,这个现象称为穿原创 2021-07-04 20:53:36 · 233 阅读 · 0 评论 -
位运算相关
位运算:位运算有如下几种运算符:运算方式:在计算机内部运算均是以补码的形式进行运算的。步骤:将十进制数化为二进制远原码、再将原码通过反码求补码、以补码进行位运算。示例:~2、2&-3、-1>>2~2=?2&-3=?-1>>2=?(图片来自尚硅谷)...原创 2021-07-03 21:40:44 · 78 阅读 · 0 评论 -
输出函数——printf注意事项
域宽:可以在格式声明中指定输出数据的域宽(所占的列数),如用 “%5d”,指定输出数据所占 5 列,输出的数据显示在此 5 列区域的左侧。如:printf("%5d\n%5d\n",12,-345);输出结果为:12 ( 12 前面有 3 个空格)-345 (-345前面有1个空格)其他任何输出格式均可以指定域宽,如%c、%f、%s。输出字符时:一个整数,如果在 0-127 范围中,也可以用 “%c” 使之按字符形式输出,在输出前,系统会将该整数作为 ASCLL 码转换成相应的字符原创 2021-07-03 21:20:45 · 1935 阅读 · 0 评论 -
数据类型的大小(int型为例)
上图int型能表示的范围是-2147483648(-215) – 2147483647(215 -1)int型占系统分配的4个字节(不同系统不一样)8个位,最高一位为符号位。10000000时表示-215 、01111111时表示215 - 1unsigned int 为无符号整型范围为0 – 216 - 1,全0为0,全1为 216 - 1...原创 2021-06-27 22:11:48 · 3052 阅读 · 0 评论 -
浮点类型(C)
上图Turbo C 对long double 型分配16个字节如上图所示,而Vsiual C++则对long double 型和 double 型一样处理,分配8个字节,上图没有给出,有效数字应为15-16。精确一点的范围:1.210-38 – 3.41038、2.310-308 – 1.710308 、3.410-4932 – 1.1104932这些为数值范围(取绝对值后),还有共同的 0。浮点数使用细节1)浮点数常量默认为double型,声明float型常量时,须后加 ‘f’ 或 ‘F’。原创 2021-06-27 21:40:58 · 1089 阅读 · 0 评论 -
明确常量的类型
怎样明确常量的类型在C语言中,不仅变量有数据类型,常量也有类型。为什么要把常量分为不同的类型呢?在程序中出现的常量是要存放在计算机的存储单元中的。这就必须分配给它多少字节,按什么方式存储。例如,程序中有整数12,在Visual C++中会分配给它4个字节,按补码方式存储。确定常量的类型字符常量只要看到由单撇号括起来的单个字符或转义字符就可以知道他是字符常量。整型常量不带小数点的数值是整型常量,但应注意其有效范围。如:在Turbo C中,系统为整型数据分配两个字节,其值为-32768--32原创 2021-06-27 20:58:18 · 611 阅读 · 0 评论 -
自动转换与强制转换
1).数据类型按精度(容量)大小排序为2).数据类型自动转换表规则2.自动类型转换细节说明1)有多种类型的数据混合运算时,系统首先自动将所有数据转换成精度最大的那种数据类型,然后再进行计算(如 int 型和 short 型运算时,先把short转成int型再进行运算)。例:int i = 3; float f = 2.5; double d = 7.5; 10 + 'a' + i * f - d/3编译时,从左至右扫描,运算次序如下;1)进行10 + ‘a’ 的运算,‘a’ 的整数97原创 2021-02-16 23:28:22 · 911 阅读 · 0 评论 -
布尔类型
1)C语言标准(C89)没有定义布尔类型,所以C语言判断真假时以0为假,非0 为真。2)但这种做法不直观,所以我们可以借助C语言的宏定义。3)C语言标准(C99)提供_Bool型,_Bool仍是整数类型,但与一般整型不同的是,_Bool变量只能赋值为0或1,非0的值都会被存储为1,C99还提供了一个头文件<stdbool.h>定义了bool代表_Bool,true代表1,false代表0.只要导入stdbool.h,就能方便的操作布尔类型了,比如 bool flag = false;#d原创 2021-02-15 22:29:53 · 2087 阅读 · 0 评论 -
数据类型--浮点型详细
3.14159可以表示为:3.14159e0、0.314159e1、0.0314159e2、31.4159e-1等,他们都代表同一个值。可以看到:小数点的位置可以在314159几个数字之间、之前或之后(0)浮动的,只要小数点位置改变的同时改变指数的值,就可以保证他的值不会改变。由于小数点的位置可以浮动,所以实数的指数形式称为浮点数。1)关于浮点数在机器中存放形式的简单说明,浮点数 = 符号位+指数位+尾数位。浮点数是近似值。2)尾数部分可能丢失,造成精度损失。在存储时,系统将实型数据分成小数部分和指原创 2021-02-15 22:10:04 · 8401 阅读 · 0 评论 -
C程序的运行机制流程
(1)编辑:编写.c文件,就是源代码。(2)编译:将c程序翻译成目标文件(.obj)//在计算机低层执行。(3)链接:将目标文件(.obj)生成可执行文件(.exe)//在计算机底层执行。(4)运行:执行.exe文件,得到运行结果。...原创 2021-02-10 18:19:55 · 440 阅读 · 0 评论 -
指针与值传递
#include<stdio.h>void swap(int *a,int *b){ int temp; temp = *a; *a = *b; *b = temp;}int main(){ void swap(int *a,int *b); int c,d,*p1,*p2; printf("please enter c and d:\n"); scanf("%d,%d",&c,&d); p1 = &c; p2 = &d; if(c&l原创 2020-09-21 17:52:03 · 442 阅读 · 0 评论 -
JAVA——向下转型与向上转型
向上转型子类对象一定是父类的一个实例,那么用父类去声明一个子类实例时是可行的,像这样:父类 对象=new 子类构造器 ; 这样是可行的向下转型父类对象不能作为子类的实例,所以向下转型一般会出错。具体分以下两种情况:1.父类 对象1=new 子类构造器子类 对象2=对象1这样是错误的,因为对象1被父类所声明与子类不匹配,但可通过强转纠错:子类 对象2=(子类)对象12.父类 对...原创 2020-04-05 22:32:31 · 127 阅读 · 0 评论 -
JAVA——super关健字用法(子类创建对象时的易错点)
super关健字用法有以下两种:1.操作被隐藏的成员变量和被重写的成员方法(所谓被隐藏的变量是指与子类变量名相同的父类变量) 如果想在子类中操作父类中被隐藏的成员变量和被重写的成员方法,也可以使用super关键字。2.调用父类构造方法(重点)从以上截图可以看出输出子类构造器时先输出父类构造器,这就涉及到调用父类构造器。若父类无构造器,则会默认一个无参构造器,而子类则会默认super()...原创 2020-04-05 14:49:36 · 242 阅读 · 0 评论 -
JAVA——类名作方法返回值类型
用类名可以作方法返回,返回该类的实体类对象;并且,可以通过相关途径访问到该对象里面的属性;此外,当父类名作方法返回时,可返回子类实体类对象。...原创 2020-04-01 17:11:18 · 1580 阅读 · 0 评论