数据结构
1、绪论
1.1、什么是数据结构?
数据结构是一门研究非数值计算的程序设计中计算机的操作对象以及它们之间的关系和操作等的学科。
程序 = 数据结构 + 算法
数值计算:
- 线性方程组
- 微分方程
- …
非数值计算:
- 表
- 树 (一对多)
- 图 (多对多)
1.2、基本概念和术语
术语 | 基本概念 |
---|---|
数据 | 数据是用于描述客观事物的数值、字符,以及一切可以输入到计算机中,并由计算机程序加以处理的符号的集合,其范围随着计算机技术的发展而不断发展。 |
数据元素 | 数据元素是构成数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。 |
数据项 | 数据元素可细分成由若干数据项(字段)组成,数据项是具有独立含义的最小单位。 |
数据对象 | 数据对象是具有相同性质的数据元素的集合,是数据的子集。 |
数据结构 | 数据结构是相互间存在着一种或多种特定关系的数据元素的集合,是带有结构的数据元素的集合,它指的是数据元素之间的相互关系,即数据的组织形式。 |
数据类型:
数据类型是一组性质相同的值的集合以及定义于这个值集合上的一组操作的总称。
例:在C语言中提供的数据类型:
- int,char , float, double等原子类型(基本类型)
- 数组、结构体、共用体、枚举等结构类型
- 指针、空(void)类型等
数据类型是计算机中已经实现了的数据结构,也可称之为固有数据类型。
抽象数据类型(Abstract Data Type):
一个数学模型以及定义在该模型上的一组操作,
包含:
- 一个数据对象
- 数据对象中各元素的关系
- 一组处理数据的操作
抽象数据类型定义的常用格式:
ADT抽象数据类型名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
}ADT抽象数据类型名
例如∶抽象数据类型三元组<e1,e2,e3>的定义
ADT Triplet{
数据对象:D={e1,e2,e3l e1,e2,e3,∈ElemSet}
数据关系:R={<e1,ez>,<e2,e3>}
基本操作:
lnitTriplet(&T,v1,v2,v3)
DestroyTriplet(&T)
Put(&T, i ,e)
Get(T, i ,&e)
lsAscending(T)
lsDescending(T)
Max(T,&e)
Min(T,&e)
}ADT Triplet
ADT的两个重要特征:
1.数据抽象
用ADT描述程序处理实体时,强调其本质的特征和所能完成的功能,以及它和外部用户的接口(即:外界使用它的方法)
2.数据隐藏
对用户隐藏数据存储和操作实现的细节,使用者仅需要了解操作或界面服务,通过使用界面服务来访问数据。
ADT包含定义和实现两个部分,其中定义是独立于实现的。
ADT的实现:
- 依赖具体的语言。
- 需要诵过固有数据类型(如整型、实型、字符型等)来表示和实现。
1.3、数据结构的内容
-
逻辑结构:
数据元素之间的逻辑关系,即从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。
分为线性结构和非线性结构(树型结构和图型结构)
-
存储结构
数据的存储结构也称物理结构,是数据的逻辑结构在计算机存储器内的表示(或映像),它依赖于计算机。
存储(物理)结构:顺序结构、链式结构、索引结构、散列结构。
-
数据的运算
数据的运算是指在数据的逻辑结构上定义的关于数据的操作算法。
数据的运算要在数据的存储结构上实现。数据的运算:插入、删除、修改、查找、排序、…
1.4、算法和算法分析
算法的基本特征:
- 有穷性 一个算法在执行有限步之后必须结束。
- 确定性 算法的每一步骤必须确切定义,即无二义性。
- 可行性 算法中所有的运算都可以精确地实现。
- 输入 算法有零个或多个输入,即在算法开始之前,对算法给定的初始量。
- 输出 算法有一个或多个输出,即与输入有某个特定关系的量,简单地说就是算法的最终结果。
函数参数:
①、指针变量做参数
void swap( int *p1 , int*p2 ){
int temp;
temp=*p1; *p1=*p2;*p2=temp;
}
void main (){
int i=3, j=5;
swap( &i,&j);
printf(“%d %d”,ij);
}
引用类型:类型名&变量名;
所谓的引用就是给变量起一个别名。
换句话说,就是这个“别名”和原来的变量共用一个地址。无论对原变量或对其引用的修改,其实都是对同一地址内容进行修改,因而变量和对它的引用总具有相同的值。
例如:
int i = 5;
int & j = i;
j= 10;
printf("%d %d",i,j);
i = 1;
printf("%d %d”,i,j);
输出:
10 10
1 1
可修改原函数为:
void swap (int & a , int & b ) {
int temp;
temp=a;a=b;b=temp;
}
void main (){
int i=3, j=5;
swap( i , j);
printf(“%d %d”,ij);
}
函数参数分为:
- 赋值参数
- 引用参数