数据结构 一
读郝斌——数据结构笔记
/*
2012/4/5
*/
数据结构
1. 数据结构的定义
2. 预备知识
3. 模块一:线性结构(数组和链表,两种常见应用:队列和栈)
4. 专题:递归(递归和循环的转换、求阶乘、汉诺塔、走迷宫)
5. 模块二:非线性结构(树、图)
6. 模块三:查找和排序(折半、以及最常见的五种排序方法)
数据结构:
什么叫数据结构?
把实际问题转换为特定的数据类型,并且采用一种存储结构来组织这类大量的数据 保存在内存中,以及在此基础上为实现某个功能而编写的程序 就叫 数据结构
那么,为实现某个功能而编写的代码我们就成为算法
衡量算法的标准:
1. 时间复杂度——大概程序执行的次数
2. 空间复杂度——大概占用的最大内存
3. 算法的难易程度
4. 健壮性——非法输入
好了,上面就是让大家轻松轻松,我们来讲讲数据结构的预备知识
我们之前有学过C语言,其实这个数据结构的预备知识就是对C语言的复习
好,来C语言的复习
一、 指针
二、 结构体
三、 动态内存分配
指针
/*
基本类型的指针
*/
# include <stdio.h>
int main()
{
int i;
int *j = &i ; //定义一个 int * 类型(叫做int类型的指针)的变量 j 指向 i的地址
i = 5;
printf(“%d ”, *j);
return 0;
}
# include <stdio.h>
void f(int i)
{
i = 100;
}
int main( void )
{
int i = 9;
f(i);
printf("%d",i);
return 0 ;
}
//f函数的i和main函数的i是用一个栈来压入的,所以不存在压的方式,所以不能够相互访问
地址的概念
# include <stdio.h>
void f(int* i) //定义了一个形参,改形参名字是 i,类型 :int*
{
i = 100;
}
int main( void )
{
int i = 9;
f( &i ); //把这个i的地址发送给另外一个i
printf("%d",i);
return 0 ;
}
CPU 只能访问内存,所以要先把硬盘的东西导入内存
通过 地址总线 、 控制线、 数据线 来访问 内存
地址线是确定是哪个单元
控制线是确定读还是写
数据线是和CPU进行交互
地址就是内存单元的编号
从0开始的非负整数
范围: 0 — FFFFFFFF 【0 - 4G-1】
指针:
指针就是地址
指针变量 是存放地址的变量
指针的本质就是一个操作受限的非负整数//操作受限:不能加乘除,只能在某些情况下进行相减
/*
指针和一维数组的关系
*/
# include <stdio.h>
int main(void )
{
int a[5] = {1,2,3,4,5};
//一维数组名a 存放的是数组的第一个元素的地址
//a 是一个指针常量! 一般我们说常量都是一开始就赋值了之后不可改变
a[1] == *(a+1)
a[3] == *(3+a)
a是第一个,3是第三个, *就是本身
p+i 的值是 p+i*字节数
return 0;
}
#include <stdio.h>
//参数要写两个,第一写元素首地址,第二写数组元素个数
//void array(int a[],int n)
void array(int *p,int n)
{
*(3+p) = -1;
}
int main(void)
{
int a[5] = {1,2,3,4,5};
array(a,5);
printf("%d",a[3]);
return 0;
}