数据结构学习笔记---基础篇

来源:互联网 发布:微信外卖系统源码 编辑:程序博客网 时间:2024/04/29 09:23
数据结构是数据存储的方式,算法则是 处理数据的方法,通常我们通过分析算法的时间复杂度和空间复杂度来判断它的好坏。
学好数据结构可以使计算机更高效地工作。
时间复杂度的数量级有log(2)n, n , nlog(2)n , n的平方,n 的立方 , 2 的n次方,n!

算法:
    狭义的算法是与数据存储方式密切相关
    广义的算法是与数据的存储方式无关    
    泛型:
               利用某种技术达到的效果就是:不同的存数方式,执行的操作一样



C指针复习
指针是C语言的灵魂
地址是内存单元的编号,从0开始的非负整数 范围:0 --FFFFFFFF
指针就是地址 地址就是指针
指针变量是存放内存单元地址的变量
指针的本质是一个操作受限的非负整数
分类:1、基本类型的指针 
#include <stdio.h>

void f(int * p) //不是定义了一个名字叫*i的形参,
//而是定义了一个形参p,该形参名字叫做p,它的类型是int *
{
    *p = 100;  //p就是i
}

int main(void)
{
    int i = 9;
    f(&i);
    printf("i = %d\n , i");

    return 0;
}
2、指针和数组
#include <stdio.h>
int main(void)
{
    int a[5] = {1,2,3,4,5};  // a指向a[0]
//下标和指针的关系 a[i]  <<==>> *(a+i)
//一维数组名是个指针常量
//它存放的是一维数组第一个元素的地址,它的值不能改变
//一维数组名指向的是数组的第一个元素

    return 0;
}

#incluede <stdio.h>
int main(void)
{
    double * p;
    double x = 66.6;

    p = &x; //X占8个字节 1个字节是8位,一个字节一个地址,P存放首地址
    double arr[3] = {1.1, 2.2, 3.3};
    double * q;
    q = &arr[0];
    printf("%p\n", q);
    q = &arr[1];
    printf("%p\n", q);
}
通过函数修改实参(指针)的值
#include <stdio.h>
void f(int * q);
int main(void)
{
 int i = 10;
 int * p = &i;
 printf("%p\n", p);
 f(&p);   //指针的指针
 printf("%p\n", p)
 return 0;
}
void f(int ** q)
{
 .....
}

结构体
    为什么会出现结构体
    为了表示一些复杂的数据,而普通的类型变量无法满足要求
    什么叫结构体
        结构体是用户根据需要自己定义的一个数据类型
    如何使用结构体
        两种方式
        struct Student st = { 1000, "zhangsan", 20 };
         struct Student * pst;
    1.st.sid
    2.pst->sid   //pst所指向的结构体变量中的sid这个成员
    注意事项:
        结构体变量不能加减乘除,但是可以相互赋值
        普通结构体变量和结构体指针变量作为函数传参的问题
#include <stdio.h>
#include <string.h>
struct Student
{
 int sid;
 char name[200];
 int age;
};  //分号不能省
int main(void)
{
 struct Student st = { 1000, "zhangsan", 20 };
 printf("%d %s %d\n", st.sid, st.name, st.age);
 
 st.sid = 99;
 // st.name = "lisi"; //error
 strcpy_s(st.name, "lisi");
 st.age = 22;
 printf("%d %s %d\n", st.sid, st.name, st.age);
 getchar();
 return 0;
}
一般使用第二种方式
#include <stdio.h>
#include <string.h>
struct Student
{
 int sid;
 char name[200];
 int age;
};  //分号不能省
int main(void)
{
 struct Student st = { 1000, "zhangsan", 20 };

 getchar();
 return 0;
}

int main(void)
{
 struct Student st = { 1000, "zhangsan", 20 };
 //st.sid = 99 ;//第一种方式
 struct Student * pst;
 pst = &st;
 pst->sid = 99; //pst->sid 等价于(*pst).sid , 而(*pst).sid等价于st.sid
 getchar();
 return 0;
}

传递形参 结构体
struct Student
{
 int sid;
 char name[200];
 int age;
};  //分号不能省
void f(struct Student * pst);
int main(void)
{
 struct Student st;
 f(&st);
 printf("%d %s %d\n", st.sid, st.name, st.age);
 getchar();
 return 0;
}
void f(struct Student * pst)
{
 (*pst).sid = 99;
 strcpy_s(pst->name, "Haowei");
 pst->age = 23;
}

malloc
#include <stdio.h>
#include <string.h>
#include <malloc.h>
int main(void)
{
 int a[5] = { 4, 6, 2, 3, 5 };
 int len;
 printf("请输入你需要分配的数组长度:len = ");
 scanf_s("%d", &len);
 int *pArr = (int *)malloc(sizeof(int) * len);//
 *pArr = 4; //类似于a[0] =4
// pArr[1] = 10;
// printf("%d %d ", *pArr, pArr[1]);
// free(pArr); //把pArr 所代表的动态分配的20个字节的内存释放
 for (int i = 0; i < len; ++i)
  scanf_s("%d", &pArr[i]);
 for (int i = 0; i < len; ++i)
  printf("%d ", *(pArr + i));
 getchar();
 return 0;
}

跨函数使用内存的问题
通过动态内存来实现malloc

typedef
typedef int ZHANGSAN;//为int重新多取一个名字

typedef struct Student
{
 int sid;
 char name[100];
 char sex;
}ST;

typedef struct Student
{
 int sid;
 char name[100];
 char sex;
}* PST;  //PST等价于struct Student *

int main()
{
    struct Student st;
    PST ps = &st;
    ps->sid = 99;

}

typedef struct Student
{
 int sid;
 char name[100];
 char sex;
}* PSTU , STU;  //PST等价于struct Student * ,ST等价于struct Student

0 0
原创粉丝点击