介绍
如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序)而执行的相应的操作,这个相应的操作叫做算法。
数据结构 = 个体 + 个体的关系
算法 = 对存储数据的操作(解题的方法和步骤)
衡量算法的标准
- 1.时间复杂度:大概程序要执行的次数,而非执行的时间;
- 2.空间复杂度:算法执行过程中,大概所占用的最大的内存;
- 3.难易程度
- 4.健壮性
数据结构的地位
数据结构是软件中最核心的内容。
程序 = 数据的存储 + 数据的操作 + 可以被计算存储的语言(C,C++等等)
预备知识-指针
指针的重要性:指针是C语言的灵魂
地址:内存单元的编号,从0开始的非负整数,范围:0---FFFFFFFF[0---4G-1]
指针:指针就是地址 地址就是指针
指针变量:就是存放地址的变量
#include <stdio.h> int main(void) { int * p; //p是个指针变量,int * 表示该p变量只能存储int类型变量的地址 /*ps:int *是一个整体(定义一个指针变量,类似int),不要把*p当一个整体 int p相当于定义一个p变量 int * p相当于定义一个p指针变量 */ int i = 10; int j; p = &i; j = *p; //等价于 j = i //此时的p存放了i的地址i,此时的*起到间接取值的作用,*p就等于。 printf("i = %d, j = %d, *p = %d\n",i, j, *p); return 0; } /* 输出结果:i = 10, j = 10, *p = 10 */
指针和函数:
#include <stdio.h> void f(int * p)//同上个程序:不是定义了一个名字叫做*p的形参,而是定义了一个形参是int *指针变量类型的指针变量p { *p = 100;//此时的p存放了i的地址i,此时的*起到间接取值的作用(*只能使用在指针变量 ),*p就等于。 } int main(void) { int i = 9; f(&i); printf("i = %d\n", i); return 0; } /* 输出结果:i = 100ps:通过上面的例子可以使变量在不同的函数间使用,试想如果没有指针变量,是否还能使变量在不同的函数间使用 */
指针和数组:
数组名:
一维数组名是个指针常量;
它存放的是一维数组第一个元素的地址;
它的值不能被改变;
一维数组名指向的是数组的第一个元素。
下标和指针的关系:
a[i] (<==>) *(a + i)
#include <stdio.h> int main(void) { int a[5] = {1, 2, 3, 4, 5}; printf("%p\n", a + 1); printf("%p\n", a + 2); printf("%p\n", a + 3); printf("----------------------------\n"); printf("%d\n", *a + 3);//*a + 3等价于a[0] + 3 return 0; } /* 输出结果: 0028FEF0 0028FEF4 0028FEF8 ---------------------------- 4 */
如何通过被调函数修改主调函数中一位数组的内容
1.存放数组首元素的指针变量;
2.存放数组元素长度的整形变量。
#include <stdio.h> void showArray(int * p, int len) { int i; p[0] = -1;//p[0] == *p;p[i]就是主函数的a[i] for ( i = 0; i < len; ++i) { printf("%d\n", p[i]); } printf("-----------------------\n" ); } int main(void) { int a[5] = {1, 2, 3, 4, 5}; showArray(a, 5); //a等价于&a[0], printf("%d\n", a[0]); return 0; } /* 输出结果: -1 2 3 4 5 ----------------------- -1 */
预备知识-结构体
1.为什么出现结构体
为了表示一些复杂的数据,而普通的基本类型变量无法满足要求。
2.什么叫结构体
结构体是用户根据实际需要自己定义的复合数据类型。
3.如何使用结构体
#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; strcpy(st.name, "lisi"); st.age = 22; printf("%d %s %d\n",st.sid, st.name, st.age); struct Student * pst; pst = &st; pst->sid = 88;//pst->sid等价于(*pst).sid,而(*pst).sid等价于st.sid printf("%d %s %d\n",st.sid, st.name, st.age); return 0; } /* 输出结果: 1000 zhangsan 20 99 lisi 22 88 lisi 22 */
4.注意事项:
- 结构体变量不能加减乘除,但可以相互赋值;
普通结构体变量和结构体指针变量传参问题
#include <stdio.h> #include <string.h> struct Student { int sid; char name[200]; int age; };//分号不能省 void f(struct Student *); void g(struct Student); void g2(struct Student *); int main(void) { struct Student st;//为st分配好内存 f(&st); //g(st);//直接把整体变量(至少208个字节)当实参传过去,耗内存,耗时间 g2(&st);//仅仅4个字节 //printf("%d %s %d\n",st.sid, st.name, st.age); return 0; } void f(struct Student * pst) { (*pst).sid = 99; strcpy(pst->name, "zhangsan"); pst->age = 22; } void g(struct Student st) { printf("%d %s %d\n",st.sid, st.name, st.age); } void g2(struct Student * pst){ printf("%d %s %d\n",pst->sid, pst->name, pst->age); } /* 输出结果: 99 zhangsan 22 */
预备知识-动态内存
#include <stdio.h> #include <malloc.h> int main(void) { int a[5] = {1, 2, 3, 4, 5}; //无法动态控制数组长度 int i; int len; printf("Please input length:len = "); scanf("%d", &len); int * pArr = (int *)malloc(sizeof(int) * len); for (i = 0; i < len; ++i) { scanf("%d/n", &pArr[i]); } printf("--------------------------\n"); for (i = 0; i < len; ++i) { printf("%d\n",*(pArr + i)); } free(pArr); return 0; } /* 输出结果: Please input length:len = 3 23 44 55 -------------------------- 23 44 55 */
时间: 2024-11-02 06:36:52