数据结构是数据存储的方式,算法则是 处理数据的方法,通常我们通过分析算法的时间复杂度和空间复杂度来判断它的好坏。
学好数据结构可以使计算机更高效地工作。
时间复杂度的数量级有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