0x01写在最前面
本系列文章的根本目的是为了掌握912而写的笔记,由于种种原因,基本从0开始,拓展部分的知识均有注释。
关于材料来源问题
Mark Allen Weiss & 严蔚敏 & 博客 & 论坛 & Google
0x02数据结构与时空复杂度
数据结构是一种组织和存储数据的方式。它包含三方面的内容,逻辑关系、存储关系以及操作。
逻辑结构
线性结构:一般线性表;受限线性表—栈和队列;线性表推广—数组,广义表
非线性结构:集合;树形结构—一般树,二叉树;图形结构—有向图,无向图
存储结构
顺序存储:将逻辑相邻元素存储在物理相邻单元中。
链式存储:通过指示元素存储地址的指针来标书元素之间的逻辑关系。
索引存储:附加索引表,索引表一般形式(关键字,地址)。
散列存储(哈希存储):根据关键字直接计算存储地址。
时间复杂度
时间复杂度计算要找最深层循环内语句的频度
示例由之前写的一篇文章不同斐波那契数列实现方式与其时空复杂度介绍
拓展:
------------------
------------------
0x03一些C语言知识
结构体
结构体是一种复合数据类型。C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。
typedef struct X { int a; float b; double c; char d; user_defined e; } X;
* & . ->
*指针运算符;解引用
- 表示变量为指针类型
int *i; i is an uninitialized pointer to an int.
- 解引用,表示指针变量所指向的存储单元的值
*k
&取地址;引用
- 取得变量地址,将其赋值给等式左边
k = &i; make k point to i. We take the address of i and store it in k.
- 引用,C++概念, int &a=b a引用b,即a是b的别名
示例:
int i = 10; //定义整型变量i,值为10 int *k; //定义int*类型指针k k = &i; //取出i的地址,存于k int j = *k; //定义整型变量j,*k取出存储单元中的值并存储到j当中 //此时j的值为10
.
The dot (.
) operator is used to access a member of a struct
a.b 可能是 lvalue 也可能是 non-lvalue(按 a 决定);而 a->b 必然是 lvalue。
一般来说 *. 和 -> 是等价的。
左值指的是可以取地址的变量,左值与右值的根本区别在于能否获取内存地址 ;在 c 中,左值指的是既能够出现在等号左边也能出现在等号右边的变量(或表达式),右值指的则是只能出现在等号右边的变量(或表达式)。
->
The arrow operator (->
) in C is used to access a member of a struct which is referenced by the pointer in question.
示例:
#include <stdio.h> struct Pair { int first, second; }; int main(void) { struct Pair p; p.first = 10; p.second = 20; printf("%d %d\n", p.first, p.second); struct Pair *q = &p; q->first = 30; // q is a pointer (*q).second = 40; // *q is not printf("%d %d\n", p.first, p.second); }
拓展:
------------------
Why does the arrow (->) operator in C exist?
------------------