总结:
树型数据结构解决“非数值计算问题”时的数据模型。
综上:
1、数据结构定义:
研究非数值计算的程序设计问题中的计算机的操作对象及它们之间关系和操
作等的学科。
2、
数据结构内容:
硬件——编码理论、存储装置、存取算法……
软件——编译程序、操作系统……
数学——组织数据、数据运算……
3、发展方向:
专门领域的特殊问题(多维图形)
由抽象数据类型的观点讨论问题(新趋势)
1.2基本概念及术语
一、基本概念
1、数据:
所有能输入到计算机中并能被计算机程序处理的符号的总称。
数据是信息的载体,是客观事物的符号表示。
包含:
数、字符、文字、逻辑值、图形、图像、声音……
2、数据元素
计算机程序中一条记录就是一个数据元素,是数据的基本单位,又称“结点”、“记录”。
如:
例1中,数据元素为“一本书的书目信息”。
例2中,数据元素为“一个棋盘格局”。
注:
例1中,一本书的书目信息含书名、作者名……,称为数据项。
一个数据元素可由若干个数据项组成,数据项不可分割,为数据的最小单位。
3、数据类型(每个数据项属于某确定的基本数据类型。
)
如:
C语言提供了整型、实型、字符型和指针型等基本的数据类型。
4、数据对象:
性质相同的数据元素的集合,为数据的一个子集。
如:
整数的数据对象为集合N={0,±1,±2……}。
5、关系:
数据对象中各数据元素之间存在着某种关系(或称联系)。
(一般情况下,数据元素之间的任何关系都可用前驱、后继关系描述。
)
根结点(起始结点):
没有前驱的结点(数据元素);
终端结点:
没有后继的结点(数据元素)。
课次:
02次
授课时间:
2009年9月10日星期四1-2节
教材章节:
第一章1.2节第2-4页
授课形式:
新授课教具:
黑板课本地点:
1#409教室
教学重点:
数据结构基本概念
教学难点:
数据的逻辑结构
教学过程:
二、数据的逻辑结构
逻辑结构定义:
B=(D,R)
说明——B:
数据结构
D:
数据元素的集合——表示各数据元素的信息
R:
D上关系的集合——表示各数据元素之间关系的信息
二元组表示D中各数据元素之间的前驱、后继关系。
a是b的前驱,
b是a的后继。
例1:
一年四季按时序组织的数据结构——P2例1-1
B=(D,R)
D={春,夏,秋,冬}
R={<春,夏>,<夏,秋>,<秋,冬>}
图示:
例2:
a1
*留大家考虑时间*
a2a3
a4a5a6a7a8
说明:
如上图所示,为一个含8个结点和两个关系的数据结构,每个结点含一个数据项(名称),两个关系分别为R1和R2,R1用双箭头表示,R2用单箭头表示,方框内为结点的值,方框外的文字是结点名称。
该数据结构的逻辑结构表示为:
B=(D,R)D={ai|1≤i≤8}={a1,a2,a3,a4,a5,a6,a7,a8}
R={R1,R2}
R1={,,,,,,}
R2={,,,}
三、数据结构的分类
线性结构树型结构网状结构
集合(一对一关系)(一对多关系)(多对多关系)
注:
1、将树型结构和图状结构称为非线性结构。
(特征:
一结点可能有多个直接前趋和直接后继)
2、数据结构B=(D,R)可不含任何结点,即D={},称为空数据结构。
四、数据的存储结构
(计算机内存中存储单元有唯一地址,各存储单元有唯一前驱和唯一后继。
)
存储结构——数据结构在计算机中的表示称为数据的存储结构,简称存储结构。
相邻存储单元——指两个互为前驱后继的存储单元。
存储区域——指一片相邻的存储单元。
常用的存储表示方法有:
顺序存储、链接存储、索引存储、散列存储。
1、顺序方式将逻辑上相邻的结点存储在物理位址相邻的存储单元中;
最适合于线性结构;借助程序语言的数组描述。
例1:
B=(D,R)
D={A,B,C,D,E}
R={,,,}
地址10001001100210031004
2、链接方式
不仅存储结点的值,还存储结点间关系,结点间逻辑关系由附加指针字段表示。
结点由数据域(存储结点值)指标域(存储结点后继结点的存储单元地址)组成。
(即不要求逻辑上相邻的结点在物理位置上也相邻)。
借助程序语言的指针描述。
例2:
B=(D,R)
D={82,73,91,85,69}
R={<91,85>,<85,82>,<82,73>,<73,69>}*结点值降序*
地址datalink10021003100010011004
1000
82
1001
1001
73
1004
1002
91
1003
1003
85
1002
1004
69
0
例3:
B=(D,R)
D={A,B,C,D,E,F}
R={,,,,}
A
200
BC201202
DEF
树的图型表示(逻辑结构)203204205
树的链接存储结构:
说明:
①各结点有三个域,后两个为指针域;
②链接存储方式比顺序存储方式占用的空间大;
③紧凑存储:
存储空间完全被结点值占用的存储方式(顺序存储为紧凑存储)
非紧凑存储:
链接存储为非紧凑存储
④存储密度d:
整个数据结构存储所占存储空间的比重。
d=结点值的存储量/整个结构的存储量
d值越大,数据结构所占存储空间越小;紧凑存储的存储密度为1
课次:
03次
授课时间:
2009年9月15日星期二5-6节
教材章节:
第一章1.3节第4-5页
授课形式:
新授课教具:
黑板课本地点:
1#409教室
教学重点:
数据的运算
教学难点:
数据运算的算法描述
教学过程:
3、索引方式:
存储结点信息的同时,建立附加索引表,由索引项(关键词、地址)组成。
关键词作用:
利用关键词查到结点所在存储位置。
密集索引——线性结构中,每个结点对应索引表中的一个索引项。
分块索引——若干个相邻结点组合在一起称为一块;
每块对应索引表的一个索引项。
索引存储方式用于解决各结点长度不同的数据结构存储。
4、散列方式
利用该结点的值确定该结点的存储单元地址。
loc(a)=Hash(a.key)
注:
loc(a):
结点a的地址
Hash(a.key):
散列函数(第六章详细介绍)
a.key:
结点a中的某数据项(关键词),以此作为自变量。
1.3数据运算和算法
一、常见的数据运算
1、插入:
向数据结构中增加新结点。
2、删除:
删除数据结构中指定的结点。
3、更新:
改变指定结点的值或改变某些结点间的关系。
4、查找:
以数据项的值查找,或以关系为条件进行查找。
如:
查找树型结构中的叶子结点,但可以关系为查找条件。
5、排序:
各结点按数据项值的排列顺序建立线性表的新关系。
二、算法
(由于数据运算定义在数据的逻辑结构上,具体实施依赖于数据的存储结构)
所以,当数据采用不同的存储结构时,同样的运算其算法也不相同。
1、定义:
算法是对特定问题求解步骤的一种描述,是指令的有限序列。
2、特征:
有穷性、确定性、可行性、输入、输出
一个算法有0个或多个输入,输入取决自于某个特定对象的集合。
一个算法有1个或多个输出,输出是同输入有着某些特定关系的量。
算法可用自然语言、计算机语言、流程图……来描述,本课用C语言描述。
例1:
在长度为n的字符串中,确定字符a在该字符串中的位置(假设字符串中各字符互不相同)。
分析:
字符串为字符序列——线性表的结点类型为字符型——可用顺序存储
假设:
数组S[n]存储该线性表;
I表示字符a在字符串中的位置,若字符串中不含字符a,则I值为0。
(将1赋给I——若字符串中第I个字符是a,则输出I的值,算法结束。
——若I等于n,则字符串中没有字符a,I值为0,算法结束。
I值加1——重复上述两个步骤。
)
y
n
yn
C语言描述:
intserch(charS[],intn);
{inti;for(i=1;i<=n;i++;)
ifS[I]==’a’
return(i);
return(0);}
课次:
04次
授课时间:
2009年9月17日星期四1-2节
教材章节:
第一章1.3节第5-7页
授课形式:
新授课教具:
黑板课本地点:
1#409教室
教学重点:
数据的运算
教学难点:
数据运算的算法描述
教学过程:
三、算法的评价
算法的效率包括维护算法的效率和计算机执行算法的效率两个方面。
计算机执行效率:
包括算法的空间复杂度和时间复杂度两个方面。
即空间效率和时间效率。
空间复杂度:
指执行算法所需的辅助空间的大小。
时间复杂度:
指执行完算法所需的运算次数。
例:
例1中算法的时空效率加以说明。
空间效率:
例1中,数据结构包含n个结点,算法中除数据结构本身外没有再定义其它数组,即算法
中没有使用附加辅助内存空间,所以,算法的空间复杂度为常量阶,记为O
(1)。
时间效率:
例1中的主要运算是比较,所以,算法中的比较次数就是其运算次数;
若字符串的第一个字符是a,则比较次数为1;
若字符a在字符串的末尾,则比较次数为n;
(若字符a在字符串中随机出现,则比较次数的平均值为n/2)
所以,时间复杂度与结点个数n有关,为n的线性阶,记为O(n)
常见的时空复杂度有:
0(log2n)对数阶0(n2)0(n3)0(2n)指数阶
例举书第6页例1-2、例1-3、例1-4求其算法复杂度。
练习:
P7
课次:
05次
授课时间:
2009年9月22日星期二1-2节
教材章节:
第二章2.1节第9-10页
授课形式:
新授课教具:
黑板课本地点:
1#409教室
教学重点:
线性表的类型定义及基本运算
教学难点:
线性表的类型定义
教学过程:
第二章线性表
2.1线性表的类型定义及基本运算
一、线性结构的特点
在线性结构的数据元素的非空有限集:
1、存在唯一的一个称为“第一个”的数据元素(即根结点);
2、存在唯一的一个称为“最后一个”的数据元素(即终端结点);
3、除根结点外,集合中每个数据元素只有一个前驱;
4、除终端结点外,集合中每个数据元素只有一个后继。
二、线性表的定义
1、定义(线性表是最简单、最常用的一种数据结构)
线性表(linearlist)是由n(n≥0)个性质相同的数据元素a1,a2,a3,…an组成的有限序列
记为(a1,a2,a3,…an)
说明:
n称为线性表的长度
n=0时,称线性表为空表,不含任何数据元素
n>0时,线性表中数据元素是有序排列。
[线性表中每个数据元素都有一个确定的位置]
如:
英文大写字母表(A,B,C,D……Z),为一个长度为26的线性表;
B的前驱是A,B的后继是C;
A没有前驱,Z没有后继。
2、类型
线性表中数据元素的类型可是整型、实型、字符型等,也可由用户定义,如记录类型等。
如:
学生健康情况表
学号
姓名
性别
年龄
班级
健康状况
21
王小林
男
17
计一
健康
22
陈红
女
18
计一
一般
23
王武
男
19
计一
一般
…
…
…
…
…
…
41
李丽
女
17
计一
健康
线性表长度为20,元素类型为记录类型。
该线性表中,每个学生情况为一个数据元素(又称记录),由学号、姓名、性别、年龄、班级和健康状况六个数据项组成。
3、命名:
线性表可由一个标识符来命名,如将线性表取名为A,则A=(a1,a2,a3,…an)。
4、线性表的二元组表示:
线性表为一种线性结构,可用二元组表示为:
linear_list=(A,R)A={ai|1≤i≤nn≥0}R={|1≤i≤n-1}
三、基本运算
1、置线性表为空表;
2、求线性表的长度;(即求数据元素的个数)
3、读取线性表中的第i个元素;
4、修改线性表中的第i个元素;
5、查找线性表中具有某个特征值的数据元素;
6、插入新元素到线性表的第i个元素之前;
7、删除线性表中的第i个元素;
8、对线性表中的所有元素按指定的关键词大小进行排序。
课次:
06次
授课时间:
2009年9月24日星期四1-2节
教材章节:
第二章2.2节第11-12页
授课形式:
新授课教具:
黑板课本地点:
1#409教室
教学重点:
线性表的顺序存储结构
教学难点:
顺序存储结构
教学过程:
2.2线性表的顺序存储结构及其运算
一、线性表的顺序存储结构
1、定义:
指用一组地址连续的存储单元依次存储线性表的数据元素。
线性表的顺序存储结构简称顺序表;
设线性表中每个元素占用L个存储单元(以第一个单元的存储地址作为数据元素的存储位置)
则:
线性表中第i个数据元素的存储位置表示为LOC(ai)
LOC(ai+1)=LOC(ai)+L
LOC(ai)=LOC(a1)+(i-1)*L
注:
LOC(a1)为线性表中第一个数据元素的存储位置,称为起始位置或基地址。
2、表示
线性表顺序存储结构在C语言中用一维数组表示。
顺序表C语言描述为:
typedefintET;/*ET可根据实际需要定义为其它类型*/
#definemaxlen1000;
ETS[maxlen];
说明:
①ET表示任意数据类型(本章的C语言描述算法中,数据结构的元素类型用ET表示);
②maxlen表示数组空间的大小;
(注:
定义maxlen时,要大于线性表的实际长度,以便进行插入等各种运算)
③S为数组(含有maxlen个数据元素,数据元素下标从0开始,数据元素为ET类型)。
3、特点
①线性表中逻辑关系相邻的结点,在计算机的内存中物理位置也相邻;
②线性表的顺序存储结构是一种随机存取的存储结构。
(因为:
结点ai的地址即为其存储单元地址LOC(ai)。
)
课次:
07次
授课时间:
2009年9月29日星期二5-6节
教材章节:
第二章2.2节第12-14页
授课形式:
新授课教具:
黑板课本地点:
1#409教室
教学重点:
线性表顺序存储结构的运算-插入
教学难点:
运算的算法描述
教学过程:
二、顺序表的运算
1、插入
(指在具有n个结点的线性表的第i(1≤i≤n)个结点之前(或之后)插入一个新结点X)
例1:
在第i个结点之前插入新结点
步骤:
1、把第i个到第n个之间的所有结点依次向后移动一个位置,空出第i个位置;
2、将新结点x放入第i个位置;
3、线性表长度加1;
4、若插入运算成功,函数返回值为1,反之为0。
算法描述:
————画图说明
intinsertqlist(inti,ETx,ETs[],int*p)
/*在第i个结点之前插入新结点x,顺序表用一维数组s实现,*p为指向长度变量n的指针变量*/
{intj,n;
n=*p;在顺序表末尾插入新结点时,i=n+1
if((i<1)||(i>n+1))/*i值非法*/
return(0);
else
{for(j=n;j>=i;j--)
s[j]=s[j-1];/*向后移动数据,直至插入点止,腾出空位*/
s[j]=x;/*插入新元素*/
*p=++n;
return
(1);
}}
说明:
当i=1时,x插入到第1个结点之前,则需移动n个结点;
当i=n+1时,x插入到顺序表的末尾,不需移动任何结点
课次:
08次
授课时间:
2009年10月6日星期二5-6节
教材章节:
第二章2.2节第14-15页
授课形式:
新授课教具:
黑板课本地点:
1#409教室
教学重点:
线性表顺序存储结构的运算-删除和查找
教学难点:
运算的算法描述
教学过程:
2、删除
例2:
删除顺序表中第i个结点
步骤:
1、将第i+1个到第n个之间的结点依次向前移动一个位置;
2、线性表长度减1;3、若删除成功,函数返回值为1,反之为0。
算法描述:
intdelsqlist(inti,ETs[],int*p)
{intj,n;n=*p;
if(i<1||i>n)return(0);
else{for(j=I,js[j-1]=s[j];/*向前移位,覆盖前一元素*/
*p=--n;return
(1)}}
说明:
当i=1时,从第2个到第n个之间的各结点依次向前移动一位,需移动n-1个结点;
当i=n时,不需移动任何结点
总结:
顺序表中插入或删除一个数据元素,平均大约需移动一半结点,因而其时间复杂度为O(n)。
3、查找运算
算法思想:
从存储空间的第一个结点(数组的第0号位)开始向后依次查找;
若第i个结点的值等于x,则函数返回结点x在表中的位置i+1;
若表中不存在结点x,则返回值为0。
算法描述:
intfincel(ETx,ETs[],intn)
{intj;
for(i=0;iif(i==n)return(0);return(i+1);}
三、顺序存储结构的优劣
优点:
可用一个简单公式计算出线性表中第i个结点的存放位置,易于存取。
缺点:
1、顺序表利用数组来存放结点,线性表的最大长度maxlen较难确定。
*定的太大会浪费空间,太小易发生溢出*
2、对线性表进行插入或删除操作,平均需要移动表中约一半的数据元素,消耗时间多。
课次:
09次
授课时间:
2009年10月8日星期四1-2节
教材章节:
第二章2.3节第16-19页
授课形式:
新授课教具:
黑板课本地点:
1#409教室
教学重点:
线性链表及其基本运算
教学难点:
单链表运算的算法描述
教学过程:
2.3线性表的链接存储结构及其运算
一、线性链表
1、定义:
用链接存储方式存储的线性表称线性链表,简称链表。
2、组成:
结点由数据域(存储数据本身数据)和指针域(存储结点的后继结点或前驱结点地址)。
3、单链表:
结点中只含有一个指针域的链表称为单链表。
数据域指针域
数据
指针
线性表中,最后一个结点的指针域的指针没有任何指向,将其置为空,用“∧”或NULL表示。
线性表的链接存储表示:
head
head为表头指针,指示链表中第一个结点的存储地址;head
当链表为空时,表头指针为空。
箭头为链表中的链接指针。
4、线性链表的存储结构
线性表的单链表存储结构算法描述:
typedefstructnode
{ETdata;structnode*link;}NODE;
head
存储位置12345
a4
a5
a2
a1
a3
2
∧
5
3
1
5、插入和删除操作
插入:
使用malloc(m)函数,向系统申请m个字节存储空间;
删除:
使用free(p)函数,将p结点所占用的空间释放,还给系统。
注:
只有用函数malloc()申请的内存空间才可用函数free()来释放。
二、单链表基本运算
包括:
建表、查找、插入、删除及判断是否为空表等。
1、建立单链表head
建立链表,首先生成表头结点,形成一个空链表。
然后逐一增加新的结点,反复执行以下步骤:
①使用malloc函数,开辟新的存储单元;
②读入新结点的数据,新结点的指针域为空;
③把新结点链接到链表上;
重复以上步骤,至生成n个结点为止。
建立单链表的算法描述如下:
NODE*create(intn)/*建立一个带有n个结点的单链表*/
{NODE*head,*p,*q;
inti;
p=(NODE*)malloc(sizeof(NODE));
/*根据链表长度申请结点存储空间,生成一个NODE型结点*/
p→data=0;p→link=NULL;/*生成表头结点,指针域为空,形成一空链表*/
head=p;
for(i=1;i<=n;i++)
{q=(NODE*)malloc(sizeof(NODE));
scanf(“%d”,&q→data);q→link=NULL;
p→link=q;p=p→link;}/*每建立一新结点,p向后移动*/
return(head);}
算法的时间复杂度为O(n)。
2、查找结点
步骤:
①由表头指针指向的第一个结点开始,