绪论 数据结构讲义
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
性别 男 女 女 男 男 男 女
班号 9901 9902 9901 9902 9901 9902 9901
表中的记录顺序反映了数据元素之间的逻辑关 系, 用学号标识每个学生记录,这种逻辑关系可以表 示为:
<1,8>,<8,34>,<34,20>,<20,12>,
<12,26>,<26,5>
其中,尖括号<ai,ai+1>表示。 元素ai和ai+1之间是相邻的,即ai在ai+1之前,ai+1 在ai之后。
对于head为首结点指针的链表,从head所指结 点开始比较,head->no不等于20,从它的next得到 下 一 个 结 点 的 地 址 , 再 与 下 一 个 结 点 的 no 域 比 较,…,直到某结点的no域等于20,返回其name域。
数据结构的二元组表示
为了更确切地描述一种数据结构,通常采 用二元组表示:
优点:
便于修改,在进行插入、删除运算时,仅需修 改相应结点的指针域,不必移动结点。
缺点:
存储空间的利用率较低。
只能对结点进行顺序存取。
(3)索引存储方法
在存储结点信息的同时,还建立附加的索引表。 索引表中索引项的形式:(关键字,地址),关键字惟 一标识一个结点,地址作为指向结点的指针。 优点:
这种带有索引表的存储结构可以大大提高数据查 找的速度。
} ADT Complex
1.2 算法及其描述
1 什么是算法 2 算法描述
1.2.1 什么是算法
数据元素之间的关系有逻辑关系和物 理关系,对应的操作有逻辑结构上的操作 功能和具体存储结构上的操作实现。
把具体存储结构上的操作实现步骤或 过程称为算法。
算法的五个重要的特性:
(1)有穷性:在有穷步之后结束。 (2)确定性:无二义性。 (3)可行性:可通过基本运算有限次执行来
学生表的链式存储结构
存放学生表的链表的结点类型StudType定义为:
typedef struct studnode
{
int no;
/*存储学号*/
char name[8]; /*存储姓名*/
char sex[2];
/*存储性别*/
char class[4]; /*存储班号*/
struct studnode *next;
图形结构:简称为图。
该结构中的结点之间存在多对多的关系。
特点:每个结点的前驱和后继的个数都可以 是任意的。
因此,可能没有开始结点和终端结点,也可 能有序存储方法 (2)链式存储方法 (3)索引存储方法 (4)散列存储方法
(1)顺序存储方法
把逻辑上相邻的结点存储在物理位置上相邻的存 储单元里,结点之间的逻辑关系由存储单元的邻接关 系来体现。由此得到的存储表示称为顺序存储结构, 通常顺序存储结构是借助于语言中的数组来描述的。
数据结构包括:
(1)数据元素之间的逻辑关系,即数据的逻辑结 构。
(2)数据元素及其关系在计算机存储器中的存储 方式,即数据的存储结构,也称为数据的物理结 构。
(3)施加在该数据上的操作,即数据的运算。
学号 1 8 34 20 12 26 5
表1.1 学生表
姓名 张斌 刘丽 李英 陈华 王奇 董强 王萍
可以对结点进行随机访问。
在进行插入、删除运算时,只需移动存储在索引 表中对应结点的存储地址,而不必移动存放在结点表 中结点的数据,所以仍保持较高的数据修改运算效率。 缺点:
增加了索引表,降低了存储空间的利用率。
(4)哈希(或散列)存储方法
根据结点的关键字通过哈希(或散列)函数直 接计算出一个值,并将这个值作为该结点的存储地 址。
抽象数据类型(Abstract Data Type简写为 ADT)指的是用户进行软件系统设计时从问题 的数学模型中抽象出来的逻辑数据结构和逻 辑数据结构上的运算,而不考虑计算机的具 体存储结构和运算的具体实现算法。
例如,抽象数据类型复数的定义:
ADT Complex
{ 数据对象:
D={e1,e2|e1,e2均为实数} 数据关系:
2 算法描述
以后讲述中采用C/C++语言描述算法。
说明:C++语言中提供了一种引用运算符 “&”,引用是个别名,当建立引用时,程序 用另一个已定义的变量或对象(目标)的名字 初始化它,从那时起,引用作为目标的别名 而使用,对引用的改动实际就是对目标的 改动。
例如: int a=4; int &b=a; 这里说明b变量是变量a的引用,b也等于4,
B=(K,R) 其中,B是一种数据结构,它由数据元素的 集合K和K上二元关系的集合R所组成。其中:
K={ki| 1≤i≤n,n≥0} R={rj| 1≤j≤m,m≥0}
若n=0
则K是一个空集,因而B也就无结构可言, 有时也可以认为它具有任一结构。
若m=0
则R是一个空集,表明集合K中的结点间 不存在任何关系,彼此是独立的。
优点:
节省存储空间,结点之间的逻辑关系没有占用额 外的存储空间。
采用这种方法时,可实现对结点的随机存取。
缺点:
不便于修改,对结点的插入、删除运算时,可能 要移动一系列的结点。
(2)链式存储方法
不要求逻辑上相邻的结点在物理位置上也相邻, 结点间的逻辑关系是由附加的指针字段表示的。由 此得到的存储表示称为链式存储结构,通常要借助 于语言中的指针类型来描述。
特点:
查找速度快,只要给出待查结点的关键字,就可 立即计算出该结点的存储地址。
只存储结点的数据,不存储结点之间的逻辑关系。
一般只适合要求对数据能够进行快速查找和插入 的场合。
4 数据结构和数据类型
(1)数据类型
在用高级程序语言编写的程序中,必须对程序 中出现的每个变量、常量或表达式,明确说明它们 所属的数据类型。
/*存储指向下一个学生的指针*/
} StudType;
head
1 张斌 男 9901 8 刘丽 女 9902 34 李英 女 9901 20 陈华 男 9902 12 王奇 男 9901 26 董强 男 9902 5 王萍 女 9901 ∧
学生表构成的链表
对于“学生表”这种数据结构,可以进行一系 列的运算。
之后这两个变量同步改变。
引用常用于函数形参中,采用引用型形参时,在 函数调用时将形参的改变回传给实参。例如,有如下 函数(其中的形参均为引用型形参):
void swap(int &x, int &y) /*形参前的“&”符号不是指针运算符*/
{ int tmp=x; x=y; y=tmp;
} 当用执行语句swap(a,b)时,a和b的值发生了交换。
R1={<e1,e2>| e1是复数的实数部分,e2 是复数 的虚数部分 }
基本操作:
AssignComplex(&Z,v1,v2) : 构 造 复 数 Z , 其 实 部 和 虚部分别赋以参数v1和v2的值。
DestroyComplex(&Z):复数Z被销毁。 GetReal(Z,&real):用real返回复数Z的实部值。 GetImag(Z,&Imag):用Imag返回复数Z的虚部值。 Add(z1,z2,&sum) :用sum返回两个复数z1,z2的和 值。
例1.3 编写一个算法, 读入三个整数x,y和z的 值,要求从大到小输出这三个数。
解:
依次输入x,y和z这三个整数,通过比较 交换后,使得x≥y≥z,然后输出x,y,z。
在算法中应考虑对这三个元素作尽可能少 的比较和移动,如下述算法在最坏的情况下只 需进行3次比较和7次移动。
void Descending()
可用连续的存储空间或者不连续的存储空间来 存储该学生表,即可用顺序存储结构和链式存储结 构来存储该表。
学生表的顺序存储结构
存放学生表的结构体数组Stud定义为:
struct {
int no;
/*存储学号*/
char name[8]; /*存储姓名*/
char sex[2]; /*存储性别*/
char class[4]; /*存储班号*/
不同类型的变量,其所能取的值的范围不同, 所能进行的操作不同。
数据类型是一个值的集合和定义在此集合上的 一组操作的总称。
如C/C++中的int就是整型数据类型。
它是所有整数的集合(在16位计算机中为- 32768到32767的全体整数)和相关的整数运算 (如+、-、*、/等)。
(2)抽象数据类型
} Stud[7]={{1,“张斌”,“男”,“9901”},…,
{5,"王萍","女","9901"}};
结构体数组Stud各元素在内存中顺序存 放,即第i(1≤i≤6)个学生对应的元素Stud[i]存 放在第i+1个学生对应的元素Stud[i+1]之前, Stud[i+1]正好在Stud[i]之后。
11>}
一种数据结构还能够利用图形形象地表示出来, 图形中的每个结点对应着一个数据元素,两结点之间 的连线对应着关系中的一个序偶。
上述“学生表”数据结构用下图的图形表示。
k1 k2 k3 k4 k5 k6 k7
学生表数据结构图示
2 逻辑结构类型
(1)线性结构 线性结构
结点之间存在一对一的关系。
特点:
数据元素: 是数据(集合)中的一个“个体”,是数据的基
本单位。 有时可称之为结点、顶点。
例如,200402班为一个学生数据,而其中的 “张三”是一个数据元素)。
数据结构:
是指数据以及数据元素相互之间的联系。 可以看作是相互之间存在着某种特定关系的 数据元素的集合。
数据结构可以看成是带结构的数据元素的 集合。
{ printf("输入x,y,z"); scanf("%d,%d,%d",&x,&y,&z);
if (x<y) { temp=x;x=y;y=temp;/*交换x,y,使x>=y*/
}
if (y<z) {
temp=z; z=y; /*使temp>z*/ if (x>=temp) y=temp; else {
K={2,6,3,1,8,12,7,4,5,10,9,11}
R={r1,r2}
其中:r1表示行关系,r2表示列关系
r1={<2,6.<6,3>,<3,1>,<8,12>,<12,7>,<7,4>,<5,10>,<10,9
>,<9,11>}
r2={<2,8>,<8,5>,<6,12>,<12,10>,<3,7>,<7,9>,<1,4>,<4,
例如,增加一个学生记录、删除一个学生记录、 查找性别为“女”的学生记录、查找班号为“9902” 的学生记录等等。
在学生表的两种存储结构上实现同样的运算, 如增、删、改、查等,具体的实现过程是不同的。
例如,查找学号为20的学生的姓名:
对 于 Stud 数 组 , 可 以 从 Stud[0] 开 始 比 较 , Stud[0].no不等于20,再与Stud[1].no比较,…,直 到Stud[3].no等于20,返回Stud[3].name。
例如,采用二元组表示例1.1的学生表。 学生表中共有7个结点,依次用k1~k7表示, 则对应的二元组表示为B=(K,R),其中:
K={k1,k2,k3,k4,k5,k6,k7} R={r} r={<k1,k2>,<k2,k3>,<k3,k4>,<k4,k5>,<k5,k6>,
<k6,k7>}
对应的二元组表示为B=(K,R),其中:
非线性结构
开始结点和终➢端树结点都是惟一的。
除了开始结点和➢图终端结点以外,其余结点都有 且仅有一个前驱,有且仅有一个后继。有序表就是
典型的线性结构。
(2)非线性结构
结点之间存在一对多或多对多的关 系。它又可分为树形和图形结构两类。
树形结构:简称为树。
该结构中的结点之间存在一对多的关系。
特点:每个结点最多只有一个前驱,但可以 有多个后继,可以有多个终端结点。
第一章 绪论
1.1 什么是数据结构 1.2 算法及其描述 1.3 算法分析
1.1 什么是数据结构
1 数据结构的定义 2 逻辑结构类型 3 存储结构类型 4 数据结构和数据类型
1 数据结构的定义
数据: 是所有能被输入到计算机中,且能被计算机处
理的符号的集合。它是计算机操作的对象的总称, 也是计算机处理的信息的某种特定的符号表示形 式。
实现。
(4)有输入 (5)有输出
例1.2 考虑下列两段描述:
(1)
void exam1() {
n=2; while (n%2==0)
n=n+2; printf("%d\n",n); }
(2)
void exam2() {
y=0; x=5/y; printf(“%d,%d\n”,x,y); }
这两段描述均不能满足算法的特征,试 问它们违反了哪些特征?