推荐看高一凡的书,里面有代码实现。

数据结构研究的是数据如何将现实中的复杂问题以特定的数据类型和存储结构保存在内存中。算法研究的是对某数据结构为实现特定功能而执行的操作。

衡量算法的标准有:1)时间复杂度  2)空间复杂度  3)可读性  4)健壮性    在工程上可读性是最重要的。


 

预备知识:指针、结构体、动态内存的分配和释放

指针

地址是内存单元的编号,指针变量是用来存储地址的容器。注:指针和地址是一样的,它是操作受限的非负整数。

注:内存回收是指该内存需要再次被申请并初始化才能使用,但里面会遗留上次的垃圾数据。

    int *p;//p是个指针变量,int *表示p变量只能存储int类型变量的地址
    int i = 10;
    int j;

    p = &i;//取地址操作,不能在常量和表达式前面加这个符号
    j = *p;//*p是p指向的值
    printf("i=%d,j=%d,*p=%d",i,j,*p);    
/*如何通过被调函数修改主调函数中普通变量的值
    1,实参为相关变量的地址
    2,形参为以该变量类型为类型的指针变量
    3,在被调函数中通过  *形参变量名  的方式可以修改
*/
void f(int* i) //形参是一个指向int类型的指针
{
    *i = 100;//*i就是i,改变*i就是改变i里面的值
}
int main()
{
    int i = 9;
    f(&i);//形参是i的地址
    printf("i=%d\n", i);
    return 0;
}
    int a[5] = { 1,2,3,4,5 };
    /*  一维数组名a存放的是a[0]的地址,它本身就是一个指针
    a[i]=*(a+i)   a+i=a+i*k  k为每个变量占的字节
    */
    //a[3] == *(a + 3);
    printf("%p\n", a + 1);//00F7F820
    printf("%p\n", a + 2);//00F7F824,间隔是一个int的的占位,也就是4字节
    printf("%p\n", *a + 3);//00000004
  printf("%p\n", *a + 8);//00000009
  printf("%p\n", *(a + 8));//01332163

  //加不加括号是有区别的,表示的含义不同
return 0;
void ShowArray(int *p,int len) 
{
    p[2] = -1;//p[0]==*p==a[0],p[2]==*(p+2)==*(a+2),p[i]=a[i]
    int i = 0;//注,这点和java不一样,要在循环外面定义
    for (i = 0; i < len; ++i)
    {
        printf("%d\n", p[i]);
    }
}
int main()
{
    int a[5] = { 1,2,3,4,5 };
    ShowArray(a, 5);//a即&a[0],即int*类型
    //printf("%d\n", a[2]);
    return 0;
}
  //无论指向的变量占多少字节,指针变量只占4字节,
    //因为它是int类型(在32位系统,如果是64位系统就是8字节
    double* p;
    double x = 66.6;
    p = &x;//x占8字节,1个字节8位,1个字节1个地址,p只存放1个地址——首地址
    double arr[3] = { 1.1,2.2,3.3 };
    double* q;
    q = &arr[0];
    printf("%p\n", q); //00AFFBF0        
    q = &arr[1];
    printf("%p\n", q);//00AFFBF8

今天就先到这里吧,剩下的明天再写