数据结构
书籍推荐:
-
严薇敏
-
高一凡(代码实现)
数据结构
定义
我们如何吧现实中大量复杂的问题以特定的数据类型和特定存储结构保存到存储器中,以及再在此基础上实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序)而执行的相应操作,这个操作就叫算法
eg:链表存储大量数据
(个体和个体的存储,个体之间的关系)
数据结构=个体+个体的关系
算法=对存储数据的操作
算法
解题的方法和步骤
衡量算法的标准
-
时间复杂度——大概程序要执行的次数,而非执行时间(次数可以相同,时间难以相同)
-
空间复杂度
算法执行过程中大概所占的最大内存
-
难易程度
-
健壮性
数据结构地位
数据结构是软件中最核心的课程
程序=数据的存储+数据的操作+可以被计算机执行的语言
预备知识
-
指针
指针的重要性:
灵魂
定义:
地址
内存单元编号
从0开始的非负整数
范围:0——FFFFFFFF[0——4G-1]
cpu可以访问内存(通过数据线存储数据,控制线读取,大小为4G-1),编号不可重复,内容任意
指针:
指针的就是地址,地址就是指针
指针变量是存放内存单元地址的变量
指针的本质是一个操作受限的非负整数
分类:
-
基本类型指针
#include <stdio.h>
int main(void)
{
int *p;//P是个变量名字,int*表示该个p变量只能存储 int 类型变量的地址
int i =10;
int j;
char ch ='A';
p=&i;//不可以等于&ch p指向i,*p就代表i
//不可省略,若无,,没有保存有效地址,指向不确定单元
j=*p;//等价于j=i
printf("i=%d,j=%d,*p=%d",i,j,*p);//都是10
//不可以p=10;//error
return 0;
}
#include <stdio.h>
//void f(int i)
//{
// i=100;
//}
//int main(void)
//{
// int i=9;
// f(i);
// printf("i=%d\n",i);
// return 0;
//}
void f(int *p)//不是定义一个名字叫*i的形参,而是定义了一个形参,该形参名字叫做i,他的类型是int *
{
*p=100;//*p是一个值,p是一个地址
}
int main(void)
{
int i=9;
f(&i);
printf("i=%d\n",i);
return 0;
}
#include <stdio.h>
int main(void)
{
int a[5]={1,2,3,4,5};//a指向a0,a[i]<<==>>*(a+i)
printf("%p\n",a+1);
return 0;
}
#include <stdio.h>
void Show_Array(int *p,int len)
{
int i=0;
for (i=0;i<len;i++)
{
printf("%d\n",p[i]);
}
p[2]=-1;
//p[i]就是主函数a[i]
}
int main(void)
{
int a[5]={1,2,3,4,5};//a指向a0,a,为地址,a[i]<<==>>*(a+i) //a等价于&a[0] ,&a[0]本身就是int*类型
Show_Array(a,5);
return 0;
}
注意:
-
指针变量也是变量,但只可以存放单元地址,不是内存单元内容
-
普通变量前不能加*
-
常量和表达式不可以加&
-
-
动态内存的分配和释放
A aa=new A();
A aa2=aa;
aa.f();
模块一:线性结构
-
连续存储【数组】
-
离散结构[链表]
-
栈
-
队列
专题:递归
-
1+2+3······+100
-
求阶乘
-
汉诺塔
-
走迷宫
模块二:非线性结构
树
图
模块三:查表和排序
折半查找
排序:
-
冒泡
-
插入
-
选择
-
快速排序
-
归并排序
Java中容器和数据结构相关知识
Iterator接口
Map
哈希表