引言
老话说得好:光阴荏苒,岁月如梭。
不知不觉,已然大二。当我还沉浸在由萌新竟升成为学长的欢乐时,哪里知道后面会有一门“恐怖如斯”的课程在虎视眈眈的等着我,没错,就是《数据结构》。。。算了,废话不多说,咱直接上干货!
(仅简要说明课本上出现最多的用法)
一. 关键字typedef
1.最基本用法
为现有数据类型定义同义词
typedef 使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图。如:课本中常出现的:typedef int Status;此声明定义了一个 int 的同义词,名字为 Status。你可以在任何需要 int 的上下文中使用 Status。
2.typedef 用法 & 结构体
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode;
这语句实际上完成两个操作:
1)定义一个新的结构类型
struct 关键字和第一个LNode一起构成了这个结构类型,不论是否有typedef,这个结构都存在。
我们可以用struct LNode node来定义变量node,但要注意,使用LNode node来定义变量不对 的,因为struct 和LNode合在一起才能表示一个结构类型。
2)typedef为这个新的结构起了一个名字,叫LNode。因此,LNode实际上相当于struct LNode,我们可以使用LNode node来定义变量node。
3.typedef & 结构体指针类型用法
typedef struct LNode {
ElemType data;
struct LNode *next;
} *LinkList;
可理解为typedef/struct LNode*/LinkList
即给这个指向LNode结构体的指针类型LNode*定义一个别名LinkList,任何使用LNode*的地方都可以用LinkList来替换。
二. 函数malloc(),calloc,realloc()
三个函数的申明分别是:
void* realloc(void* ptr, unsigned newsize);
void* malloc(unsigned size);
void* calloc(size_t numElements, size_t sizeOfElement);
都在stdlib.h函数库内
它们的返回值都是请求系统分配的地址,如果请求失败就返回NULL。
(1) malloc函数。
newsize为要申请的空间大小,需要我们手动的去计算,如int *p= (int *)malloc(20*sizeof(int)),如果编译器默认int为4字节存储的话,那么计算结果是80Byte,一次申请一个80Byte的连续空间,并将空间基地址强制转换为int类型,赋给指针p,此时申请的内存值是不确定的。
(2)calloc函数
其比malloc函数多一个参数,并不需要人为的计算空间的大小,比如如果他要申请20个int类型空间,会int *p = (int *)calloc(20, sizeof(int)),这样就省去了人为空间计算的麻烦。但这并不是他们之间最重要的区别,malloc申请后空间的值是随机的,并没有进行初始化,而calloc却在申请后,对空间逐一进行初始化,并设置值为0;
(3)realloc函数
更改已经配置的内存空间,即更改由malloc()函数分配的内存空间的大小。
如果将分配的内存减少,realloc仅仅是改变索引的信息。
如果是将分配的内存扩大,则有以下情况:
1)如果当前内存段后面有需要的内存空间,则直接扩展这段内存空间,realloc()将返回原指针。
2)如果当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据块释放掉,返回新的内存块位置。
3)如果申请失败,将返回NULL,此时,原来的指针仍然有效。
算法谜题:里程表之谜
汽车的里程表可以显示从000000到999999的任意六位数组合。里程表跑完整个显示区域,此间有多少个包含数字1的里程数?整个过程中,数字1显示多少次?(如,101111显示了5次数字1,下一个里程数101112显示了4次数字1)
编辑 | 黄超
排版 | 庄一鸣
审核 | 一点点
长按下方二维码关注我们
每进步一点点
都想与你同在
领取专属 10元无门槛券
私享最新 技术干货