数据结构:
1.数据的4种逻辑结构: 集合 线性结构 树形结构 图
2.数据存储: 逻辑关系 和 物理关系
顺序表: 逻辑相连,物理地址也相连
链表: 逻辑相连,物理地址不一定相连
3.线性表包括: 顺序表 链表
区分一下数组和顺序表: 数组主要关注数据的存取; 顺序表可实现存,取,插,删,改等
typedef:
#include<stdio.h>
typedef int Int;
typedef int *pint;
int main()
{
int a = 10;
Int b = 20;
printf("%d,%d\n", a, b);
int x = 100;
int *p1 = &x;
pint p2 = &x;
printf("%d,%d\n", p1, p2);
return 0;
}
上述代码请个位读者运行并观察结果,可以得到这样的结论:
typedef int Int; 的含义就是将 int 重新命名为 Int, 因此printf("%d,%d\n", a, b);的结果为两个整数;
typedef int *pint; 的含义就是将 int *(指针类型) 重新命名为 pint ,即用pint 声明一个变量和 int* 声明一个类型等价;
关于typedef有一个好记的方法(仅供参考,如果有更好的办法可以交流):
比如: int Int; 意思是定义一个整形的Int 变量,加上 typedef 后就将 Int 提升为int 这种数据类型
那么 typedef int *pint; 就是将pint 提升为int * 这种数据类型
请理解下列代码:
typedef struct student
{
int name[20];
int age;
}student; //定义一个结构体并且重命名为student
//定义一个 struct student 变量
struct student stu1;
//定义一个 struct student 变量
student stu2;
//定义一个 struct student 类型的指针变量
student *stu3;
在很多数据结构书中我们可以看到下列类型的结构体:
typedef struct student
{
int name[20];
int age;
}student,*pstudent;
student *stu1;
pstudent stu2;
/*
* 其实就是将pstudent升级为student *这种指针类型
* 所以下面的 stu1 和 stu2是同类型的指针变量
*/
复杂度分析:
1.时间复杂度:计算时间复杂度的两个原则
一个是只保留高阶项(如计算得复杂度为 n^2+n 则复杂度为O(n^2) )
另一个是不要系数( 如 计算得复杂度为 2*n 则复杂度为 O(n) )
2.空间复杂度:实现算法需要的 额外辅助空间
计算复杂度时需要一定的数学计算,要记得 等差,等比数列求和公式;
时间复杂度例子:
int Fun(int n)
{
if(i<=1)
return 1;
else
return Fun(n-1)+1; // O(n),进行n次,在返回n次
//return Fun(n-2)+1; // O(n),循环n/2次,在返回n/2次
//return Fun(n/2)+1; /* O(logn) 底数为2
n,n/2,n/4,n/8,n/16,...,1
反着看 1 2 4 8 16 32...n 总共x项
即 2^x <= n
则x等于以二为底n的对数
*/
}
/*
从1到1000
一次走一个数的路程,走1000次 Fun(n-1)
一次走两个数的路程,走500次 Fun(n-2)
一次走一半路程,走10次 Fun(n/2)
*/