绪论
数据结构的基础概念
数据结构的相关术语:
数据(data):
数据是描述客观事物的数值、字符以及能输入机器且能被处理的各种符号集合。
数据元素(Data Element):
数据元素是组成数据的基本单位,是数据集合的个体,在计算机中通常作为一个整体进行考虑和处理。
数据对象(Data 0bject):
数据对象是性质相同的数据元素的集合,是数据的一个子集。
例如:
整数集合: N={0,士1,士2,.....}
无限集
字符集合: C={‘A,”B”....,”Z'}
有限集
数据构成:1:数据个体——数据元素
2:数据元素——数据对象
数据结构(Data Structure):数据结构是指相互之,间存在一种或多种特定关系的数据元素集合,是带有结构的数据元素的集合,它指的是数据元素之间
的相互关系,即数据的组织形式。例如:表结构 树形结构 图结构
数据类型(Data Type):
数据类型是一组性质相同的值集合以及定义在这个值集合上的一组操作的总称。
抽象数据类型(Abstract Data Type):
抽象数据类型(简称ADT) 定义了一个数据对象,数据对象中各元素间的结构关系,以及一组处理数据的操作。
抽象数据类型最重要的特点是数据抽象与信息隐蔽。
ADT包括定义和实现两方面,其中定义是独立于实现的。ADT物理实现作为私有部分封装在其实现模块内,使用者不能看到,也不能直接操作该类型所存储的数据,只有通过界面中的服务问这些数据。
typedef struct node{
char Name [20] ;
char Sex;
int Age;
float Money ;
} Employee, *EmpPtr ;
数据结构的内容
逻辑结构:
数据的逻辑结构是指数据元素之间逻辑关系描述。
形式化描述:数据结构是一个二元组Data Structure= (D, R)
其中D是数据元素的有限集,R是D. 上关系的有限集。
例如:
D1=(S1,S2 )
D2 = { a,b,c,d,e,f }
R2={N}
N={<a,b>,<a,c>,<a,d>,<c,e>,<c,f>}
四种基本逻辑结构:集合结构(属于) 线性结构(一对一) 树形结构(1对多) 网状结构(多对多)
存储结构:
存储结构(又称物理结构)是逻辑结构在计算机中存储映象,是逻辑结构在计算机中的实现,它包括数据元素的表示和关系的表示。
存储结构分为:顺序存储和非顺序存储
运算集合:数据结构的目的是为了在计算机中实现操作,因此在结构上的运算集合是很重要的部分。数据结构就是研究一类 数据的表示及其相关的运算作。
算法与算法描述
1.算法:是规则的有限集合,是为解决特定问题而规定的一系列操作。
算法的特性
1.有限性:有限步骤之内正常结束,不能形成无穷循环
2.确定性:算法中的每-一个步骤必须有确定含义,无二义性
3.输入:有多个或0个输入
4.输出:至少有一个或多个输出
5.可行性:原则上能精确进行,操作可通过已实现的基本运算执行有限次而完成
算法设计的要求:
1)算法的正确性实例
2)可读性
3)健壮性
4)高效率和低存储量
例:max=0;
for (i=1;i<=n;; i++)
{ scanf ("%f ",&x) ;
if (x>max)
max=x; }
2.算法描述工具:自然语言、框图、高级语言。
程序=算法+数据结构
算法性能评价
算法评价的标准:算法执行占用机器资源主要表现在执行时间和存储空间两个方面。
算法执行时间=其所有语句执行时间的总和。
语句执行时间=该条语句的执行次数*执行一次所需时间。
语句频度是指该语句在一个算法中重复执行的次数。
for (i=0; i< n;i++) n
for (j=0; j<n;j++) n
{c[i][j]=0; n^2
for (k=0;k< n; k++) n^3
c[i][j]=c[i][j]+a[i][k]*b[k][j];} n^3
算法的时间复杂度:以语句频度刻画随问题规模n增加的函数f(n)执行时间量度记作: T(n)=0(f(n))
最坏时间复杂度:算法在最坏情况下基本操作执行时间的上界。
基本操作:是指算法中所研究问题的基本运算操作。
算法的空间复杂度:以存储单元个数刻画随问题规模增加的函数f(n)存储空间量度,记做: S(n)=0(f(n))
数据结构与C语言表示
#include<stdio.h>
void main( )
/*用数组结构*/
{ int
sum, erage;int i;
int
t[10]={80, 85, 77, 56, 68, 83, 90, 92, 80, 98} ;
sum=0
for (i=0;i<10;i++)
sum=sum+t [i] ;
aver age= sum/10;
Printf(“总分=%d
",sum);
Printf(“平均分=%d
",average); }
#include (stdio. h>
viod swap1(int a, int b)
{ int c;
c=a; a=b; b=c
pr intf (" swap1中的a=%d, b=%d",a, b);
}
viod swap2(int *a, int *b)
{ int c;
c=*a; *a=*b; *b=c
viod main()
{ int x=100, y=800;
swap1(x,y); /*调用 函数swap1 ()*/
printf ("
调用swap1后x=%d, y=%d",x, y);
/*输出调用swap1后的数据*/
x=100;y=800;
swap2(&x, &y); /*调用 函数swap2()*/
printf ("
调用swap2后x=%d, y=%d",x, y) ;
/*输出调用swap2后的数据*/
}