数据结构概述
定义:
我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序)而执行的相应操作,这个相应的操作也叫算法。
数据结构 = 个体 + 个体的关系
算法 = 对存储数据的操作
算法:解题的方法和步骤
衡量算法的标准:
- 时间复杂度
大概程序要执行的次数,而非执行的时间 - 空间复杂度
算法执行过程中大概所占用的最大内存 - 难易程度
- 健壮性
预备知识:
1. 指针
地址:
- 地址就是内存单元的编号
- 从0开始的非负整数
- 范围:0 —— FFFFFFF【0-4G-1】
指针:
指针就是地址,地址就是指针
指针变量是存放内存单元地址的变量
指针的本质是一个操作受限的非负整数
int *p;
&p==int **p;
2. 结构体
为什么会出现结构体
- 为了表示一些复杂的数据,而普通的基本类型变量无法满足要求
什么叫结构体
- 结构体是用户根据实际需要自己定义的复合数据类型
如何使用结构体
两种方式:
struct Student st={1000,“zhangsan”,20};
struct Student *pst=&st;
- st.sid
- pst ->sid
(pst所指向的结构体变量中的sid这个成员)
#include <stdio.h>
struct Student //struct Student是一种数据类型,包含sid、name、age三个成员
{
int sid;
char name[200];
int age;
}; //分号不能省
int main()
{
struct Student st={1000,"zhangsan",20}; //定义了一个变量st,包含学号、姓名、年龄三个成员数据
printf("%d %s %d",st.sid,st.name,st.age); //用【结构体变量名.成员名】的方式输出成员数据
return 0;
}
int main()
{
struct Student st ={1000,"zhangsan",20};
// st.sid=99;//第一种方式
struct Student *pst;
pst=&st; //第二种方式
pst->sid=99; //pst->sid等价于(*pst).std 而(*pst).sid等价于st.sid,所以pst->sid等价于st.sid
}
注意事项
结构体变量不能加减乘除,但可以相互赋值
普通结构体变量和结构体指针变量作为函数传参的问题
3. 动态内存的分配和释放
(这个部分好难T-T,听的吃力)
#include <stdio.h>
#include <malloc.h>
int main()
{
int a[5]={4,10,2,8,6};
int len;
printf("请输入你需要分配的数组的长度:len=");
scanf("%d",&len);
int *pArr=(int *)malloc(sizeof(int)*len);
*pArr=4; //类似于a[0]=4
pArr[1]=10; //类似于a[1]=10;
printf("%d %d\n",*pArr,pArr[1]);
free(pArr); //把pArr所代表的动态分配的20个字节的内存释放
return 0;
}
数据结构
模块一:线性结构
- 连续存储 [数组]
- 离散存储 [链表]
- 线性结构的两种常见应用之一 栈
- 线性结构的两种常见应用之一 队列
专题:递归
- 1+2+3…+100的和
- 求阶乘
- 汉诺塔
- 走迷宫
模块二:非线性结构
- 树
- 图
模块三:查找和排序
折半查找
排序:
- 冒泡
- 插入
- 选择
- 快速排序
- 归并排序
Java中容器和数据结构相关知识
Iterator接口
Map
哈希表