一、数据结构简介
- 数据结构是数据与算法的研究。数据结构包含算法、数据存储结构、排序、搜索、程序设计概念和哈希函数。
1、数据与信息
- 数据:未经处理的原始文字、数字、符号或图形等。表达出的只是一种没有评估价值的基本元素或项目。
- 信息:经过处理后的数据。
2、算法
- 数据结构+算法=可执行程序
3、算法的条件
- 输入:0个或多个数据,这些输入必须有清楚的描述或定义
- 输出:至少会有一个输出结果,不可以没有输出结果。
- 明确性:每一个指令或步骤必须是简洁明确的。
- 有限性:在有限步骤后一定会结束,不会产生无限循环
- 有效性:步骤清楚且可行,能让用户用纸笔计算求出答案。
4、数据结构的应用
- 树状结构:非线性结构,如二叉树。
- 最短路径:全球定位系统
- 搜索理论:搜索引擎
二、数据抽象化
1、基本数据类型
- 整数(int)、浮点数(float)、双精度浮点数(double)、字符(char)
2、抽象数据类型
- 将现实世界的实体或概念转化为数据结构类型来表示,以达到隐藏内部细节,只展现外观的目的。抽象数据类型是一种自定义的数据类型。
- 堆栈或队列是很典型的抽象数据类型。
三、算法与程序设计
1、程序设计
- 由合乎程序设计语言的语法规则的指令所组成的。
2、程序开发流程
- 评价程序好坏四个方面:可读性高,平均成本低,可靠度高,可编写性高
- 程序开发流程:需求-设计规划-分析讨论-编写程序-测试检验
3、程序设计风格
- 自顶向下与模块化设计
- 可读性设计:适当使用注释,将代码中的标识符或名称定义具体有意义
- 控制结构设计:顺序结构(自顶向下)、选择结构(if)、重复结构(for循环)
四、面向对象程序设计
- 属性:对象的静态外观描述
- 方法:对象中的静态响应方式
- 事件:对象可以针对外部事件做出的各种响应
1、封装
- 将代表事物特征的数据隐藏起来,并定义一些方法来作为操作这些数据的接口
2、继承
- 继承关系中被继承者称为“基类”或“父类”,继承者称为“派生类”或“子类”。
- 继承允许定义一个新的类来继承现有的类,进而使用或修改继承而来的方法,并可在子类中加入新的数据成员与函数成员。
3、多态
- 多态最直接的定义就是让具有继承关系的不同类对象,可以调用相同名称的成员函数,并产生不同的相应结果。
五、模块化设计与C语言
1、函数
- 函数分为标准函数和自定义函数两种。
- 函数基本上由函数名称、参数、返回值与返回数据类型组成。
语法格式:
返回数据类型 函数名称 (参数行)
{
程序语句区;
return 返回值;
}
2、函数调用
有返回值时:函数名称(自变量行)
- 自变量即函数参数,调用函数时,函数会将自变量的值作为参数值,所以参数和自变量的个数必须对应。
无返回值
- 函数名称() 或 函数名称(void)
由于c语言是自顶向下的结构,函数在主程序后需要声明函数,格式如下:
- 返回数据类型 函数名称(参数数据类型行):
3、参数类型介绍
- 实际参数:调用子程序的参数为实际参数
- 形式参数:被调用子程序中的参数称为形式参数。
4、参数的传递方式
- 传值调用:将主程序的参数值,传递给子程序的参数,由于实际参数与形式参数分别占用不同的内存地址,无论子程序的值如何改变,并不会影响主程序的参数值。
- 传址调用:主程序调用子程序时,将主程序的参数地址传给子程序对应的参数。由于实际参数和形式参数占用相同的内存地址,此时如果改变子程序的参数值,则主程序的参数值也会跟着变动。
六、递归算法
1、定义
递归至少需要定义两种条件
- 一个是可以反复执行的过程
- 一个是跳出执行过程的出口
2、分类
- 直接递归:在递归函数中允许直接调函数本身
- 间接递归:在递归函数中调用其他递归函数,再从其他递归函数调用回原来的递归函数。
- 尾递归:程序的最后一条指令为递归调用,及每次调用后,再回到前一次调用后执行的第一条指令就是return。
3、实例
- n的阶乘
#include<stdio.h>
int factoria(int n);
int main(void)
{
int x;
printf("请输入要计算的阶乘数:");
scanf("%d",&x);
printf("\n%d!的结果为:%d",x,factoria(x));
}
int factoria(int n){
int sum;
if(n==0)
return 1;
else
sum=n*factoria(n-1);
return sum;
}
请输入要输出的阶乘:5
5!的结果为:120
- 斐波那契数列
#include<stdio.h>
int fib(int n);
int main(void){
int x;
printf("请输入要显示的数列项数:");
scanf("%d",&x);
for (int i=0;i<=x;i++){
printf("\nfib(%d)=%d\n",i,fib(i));
}
}
int fib(int n){
if(n==0)
return 0;
else if(n==1)
return 1;
else
return fib(n-1)+fib(n-2);
}
请输入要显示的斐波那契数列:3
fib(0)=1
fib(1)=1
ifb(2)=1
fib(3)=2
七、程序效率的分析
- 有关于程序所需存储空间的量度,称之为”空间复杂度“
- 执行一个程序(或算法)所需的时间,除了编译程序的机器码和计算机中的执行速度外,需要考虑时间复杂度。