1.todo:什么是空间复杂度:
实现算法需要的额外辅助空间和问题规模之间的函数关系,与运行次数没有关系
如何计算空间复杂度:
①函数的形参不计算(因为每次执行函数都需要形参,并不是额外的辅助空间)
②常数的空间复杂度为O(1)
③递归的空间复杂度高(递归不到最后的时候,递归前面的函数不能出栈)
④并不是所有函数的空间复杂度都为(O(1)),如:筛选法求素数
2.自定义数据类型:也称为结构体
struct 类型名
{
结构体成员
};//注意分号
3.Tab键,自动补齐剩余单词
4.结构体里面也可以用结构体,结构体定义完了以后可以随意使用,它的地位和基本类型一样
5.如何访问结构体成员?
①访问结构体普通变量通过"."访问其成员
②访问结构体指针变量通过"->"访问其成员,指向符自带解引用
6.有两个符号自带解引用:[] 和 ->
7.结构体作为参数传递时,总是传递它的地址(更节约空间,传递实参也是需要时间的,实参越大,时间越长),而不传递结构体本身,因为每一个结构体都是很庞大的,字节数也是巨大的,所以实参不会传结构体而是传指针
8.typedef(type define定义类型)
定义:typedef 旧类型名 新类型名
应用:
①将复杂的类型起一个简短的别名
②将已有的类型起一个和问题相关的名字,例如size_t,time_t(工作中常用)
9.两种形式等同
struct A
{
int a;
char b;
} ;
typedef struct A A;
typedef struct A
{
int a;
char b;
} A;
10.通过typedef给一个很长的类型名起一个别名
uint64:u代表unsigned,int是整型,64代表64个位,也就是8个字节
typedef unsigned long long int uint64;
int main ( )
{
unsigned long long int a = 10 ;
uint64 b = 20 ;
printf ( "%d\n" , b) ;
return 0 ;
}
11.通过Show输出Student数组arr的所有内容
注意:数组arr每一个下标代表一个大格子,一个大格子不一定只有一个数据
struct Student
{
char name[ 20 ] ;
int age;
} ;
void Show ( const struct Student * p, int len)
{
for ( int i = 0 ; i< len; i++ )
{
printf ( "%s,%d\n" , p[ i] . name, p[ i] . age) ;
}
}
int main ( )
{
struct Student arr[ 3 ] = { "刘备" , 28 , "曹操" , 26 , "孙权" , 20 } ;
arr[ 0 ] . age = 30 ;
printf ( "%d\n" , arr[ 0 ] . age) ;
struct Student * ps = & arr[ 0 ] ;
ps-> age = 35 ;
printf ( "%d\n" , arr[ 0 ] . age) ;
Show ( arr, sizeof ( arr) / sizeof ( arr[ 0 ] ) ) ;
return 0 ;
}
12.哪一种形式传参更好
结论:传结构体地址更好一些,因为传递实参也是需要时间的,实参越大,需要的时间越长,传一个int地址只需要4个字节,而传一个结构体则需要很长的时间
struct Student
{
char name[ 20 ] ;
int age;
} ;
void Show ( struct Student stu)
{
printf ( "%s,%d" , stu. name, stu. age) ;
}
void Show ( const struct Student * ps)
{
printf ( "%s,%d" , ps-> name, ps-> age) ;
}
int main ( )
{
struct Student stu1 = { "liebei" , 28 } ;
return 0 ;
}
13.通过变量访问其结构体成员
struct A
{
int a;
int * b;
} ;
struct B
{
float c;
struct A d;
} ;
int main ( )
{
struct B bb;
struct B * pb;
bb. d. a;
bb. d. b;
bb. c;
pb-> d. a;
pb-> d. b;
pb-> c;
return 0 ;
}
14.
注意:①字符串不能直接赋值,需要使用字符串拷贝函数
②定义结构体只有在执行完最后的";"以后才算定义完
struct Student
{
char name[ 20 ] ;
int age;
} ;
struct B
{
struct B * g;
} ;
int main ( )
{
struct Student stu1;
struct Student stu2 = { "liubei" , 30 } ;
stu2. age = 28 ;
printf ( "%s,%d\n" , stu2. name, stu2. age) ;
strcpy ( stu1. name, "caocao" ) ;
stu1. age = 25 ;
printf ( "%s,%d\n" , stu1. name, stu1. age) ;
struct Student * ps = & stu1;
ps-> age = 26 ;
printf ( "%d\n" , ( * ps) . age) ;
return 0 ;
}