1.SWAP的通用版本
#define SWAP(x,y,t)((t)=(x), (x)=(y), (y)=(t))
测试用例,两个int值交换
int t;
int a = 4;
int b = 5;
SWAP(a,b,t);
2.对字符串数组的初始化。
如果有结构体如下
struct node{
char key[5];
...
};
typedef struct node *node_pointer;
声明一个数组,node_pointer head[SIZE];
可以这样初始化,head[i].key[0] = NULL;
3.图的单链表存储中,如果顶点顺序存储,就可以不用指针域。详见:《数据结构c》
4.数组越界中我能知道的一个很重要的危害:malloc,realloc等函数对内存分配之后会有记录分配情况的内存区域,而越界的数组访问,很可能将这片区域捣毁。
当然还有这个常见的危害:
int m = 0;
int a[2]={1,2};
int k = 0;
a[-1] = 4;
a[2] = 4;
printf("%d %d\n", k, m);
5.树在内存中的两种表示:1,链表(数组就不提了)2.left-child,right-brother。左孩子右兄弟的意思,就是右指针不指向右孩子,而是指向右兄弟,这样如果一个指针右指针为Null,就说明它是最右孩子,如果一个节点的左指针为空,则说明它没有孩子。这种表示是针对无限分支的树的。
6.union-find操作中的折叠规则(从root到所查找节点的结果可以作为提升下次操作的基础),加权规则(防止退化树)等提升操作性能。
7.数组元素对计算地址变化是没有影响的。代码:
int main(int argc, char *argv[])
{
long int name[2];
name[0] = 1;
name[1] = 2;
printf("%d ", &name[0] - &name[1]);
return 0;
}
结果必然是-1,无论数组是什么,两个元素之间的距离就是1.地址的实际差值就不是1了,而是long int的长度,4.
8.类似atof函数的应用中,使用val/10而不使用val*0.1,以为0.1不能用二进制精确表示。大多数机器中的二进制表示都比0.1小。
9.getchar和putchar在实际应用中常被定义为宏,避免运行时开销。