数据结构教案.docx

上传人:b****8 文档编号:9864922 上传时间:2023-02-07 格式:DOCX 页数:59 大小:115.53KB
下载 相关 举报
数据结构教案.docx_第1页
第1页 / 共59页
数据结构教案.docx_第2页
第2页 / 共59页
数据结构教案.docx_第3页
第3页 / 共59页
数据结构教案.docx_第4页
第4页 / 共59页
数据结构教案.docx_第5页
第5页 / 共59页
点击查看更多>>
下载资源
资源描述

数据结构教案.docx

《数据结构教案.docx》由会员分享,可在线阅读,更多相关《数据结构教案.docx(59页珍藏版)》请在冰豆网上搜索。

数据结构教案.docx

数据结构教案

 

《数据结构》

教案

 

第一章绪论

[教学目标]

掌握数据结构的定义、内容、方法、描述、评价。

[重点、难点]

数据结构的研究范围,研究采用的方法,算法规则描述的工具,对算法作性能评价。

[教学方法]

用多媒体课件(ppt)以及与生活实例相结合等方法讲授,这样便于描述相关概念及学生记笔记,加深他们的印象,使基础知识掌握地比较牢固。

[学习要点]

1.熟悉各名词、术语的含义,掌握基本概念,特别是数据的逻辑结构和存储结构之间的关系。

分清哪些是逻辑结构的性质,哪些是存储结构的性质。

2.了解抽象数据类型的定义、表示和实现方法。

3.理解算法五个要素的确切含义:

①动态有穷性(能执行结束);②确定性(对于相同的输入执行相同的路径);③有输入;④有输出;⑤可行性(用以描述算法的操作都是足够基本的)。

 

4.掌握计算语句频度和估算算法时间复杂度的方法。

1.1 什么是数据结构(定义)

首先介绍数据结构的相关名词。

1.       数据(Data)

数据是描述客观事物的数值、字符以及能输入机器且能被处理的各种符号集合。

 2.       数据元素(DataElement)

数据元素是组成数据的基本单位,是数据集合的个体,在计算机中通常作为一个整体进行考虑和处理。

例如:

学生登记表是数据,每一个学生的记录就是一个数据元素。

3.        数据对象(DataObject)

数据对象是性质相同的数据元素的集合,是数据的一个子集。

4.        数据结构(DATAStructure)

   数据结构是指相互之间存在一种或多种特定关系的数据元素集合,是带有结构的数据元素的集合,它指的是数据元素之间的相互关系,即数据的组织形式。

5.       数据类型(DataType)

数据类型是一组性质相同的值集合以及定义在这个值集合上的一组操作的总称。

6.       数据抽象与抽象数据类型

1)数据的抽象

高级语言中提供整型、实型、字符、记录、文件、指针等多种数据类型,可以利用这些类型构造出象栈、队列、树、图等复杂的抽象数据类型。

2)抽象数据类型(AbstractDataType)

抽象数据类型(简称ADT)是指基于一类逻辑关系的数据类型以及定义在这个类型之上的一组操作。

抽象数据类型是近年来计算机科学中提出的最重要的概念之一,它集中体现了程序设计中一些最基本的原则:

分解、抽象和信息隐藏。

一个抽象数据类型确定了一个模型,但将模型的实现细节隐藏起来;它定义了一组运算,但将运算的实现过程隐藏起来。

用抽象数据类型的概念来指导问题求解的过程,可以用图1.4来表示:

数学模型

 

抽象数据模型

 

数据结构

非形式算法

 

伪语言程序

 

可执行程序

                        图1.4求解过程

数据结构是基础,抽象数据类型是中枢。

1.2 数据结构的内容

 数据结构的内容可归纳为三个部分。

逻辑结构、存储结构、运算集合。

数据结构是一门主要研究怎样合理地组织数据、建立合适的数据结构、提高计算机执行程序所用的时空效率的学科。

1.3 算法

1. 算法(Algorithm)定义

算法是规则的有限集合,是为解决特定问题而规定的一系列操作。

 2.算法的特性 

⑴有限性 有限步骤之内正常结束,不能形成无穷循环。

⑵确定性 算法中的每一个步骤必须有确定含义,无二义性得以实现。

⑶输 入 有多个或0个输入

⑷输 出 至少有一个或多个输出。

⑸可行性原则上能精确进行,操作可通过已实现基本运算执行有限次而完成。

在算法的五大特性中,最基本的是有限性、确定性、可行性。

 3.算法设计的要求

一般应该具有以下几个基本特征:

1)算法的正确性2)可读性3)健壮性4)高效率和低存储量

1.4 算法描述的工具

1.算法、语言、程序的关系

先分析数据结构中算法、语言、程序的关系:

⑴算法:

描述了数据对象的元素之间的关系(包括数据逻辑关系、存贮关系描述)。

⑵描述算法的工具:

(自然语言、框图或高级程序设计语言)

⑶程序是算法在计算机中的实现(与所用计算机及所用语言有关)

 2.设计实现算法过程步骤:

●        找出与求解有关的数据元素之间的关系(建立结构关系)

●        确定在某一数据对象上所施加运算

●        考虑数据元素的存储表示

●        选择描述算法的语言

●        设计实现求解的算法,并用程序语言加以描述。

3.类描述算法的语言选择

采用了标准C语言作为算法描述的工具。

1.5 对算法作性能评价

1.性能评价

对问题规模与该算法在运行时所占的空间S与所耗费的时间T给出一个数量关系的评价。

2.有关数量关系计算

数量关系评价体现在时间——算法编程后在机器中所耗费时间。

数量关系评价体现在空间——算法编程后在机器中所占存储量。

 1)关于算法执行时间

一个算法的执行时间大致上等于其所有语句执行时间的总和,对于语句的执行时间是指该条语句的执行次数和执行一次所需时间的乘积。

 2)语句频度

语句频度是指该语句在一个算法中重复执行的次数。

3)算法的时间复杂度:

所谓算法的时间复杂度,即是算法的时间量度记做:

                  T(n)=O(f(n))

它表示随问题规模n的增大算法的执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度。

4)数据结构中常用的时间复杂度频率计数

数据结构中常用的时间复杂度频率计数有7个:

 O

(1)常数型     O(n)线性型     O(n2)平方型        O(n3)立方型

 O(2n)指数型   O(log2n)对数型   O(nlog2n)二维型

5)最坏时间复杂度

算法中基本操作重复执行的次数还随问题的输入数据集的不同而不同。

6)算法的空间复杂度

关于算法的存储空间需求,类似于算法的时间复杂度,我们采用空间复杂度作为算法所需存储空间的量度,记做:

S(n)=O(f(n))

1.6 关于学习数据结构

1.数据结构课程地位

 数据结构发展趋势包括两个方面:

一是面向专门领域中特殊问题的数据结构的研究和发展,如图形数据结构、知识数据结构、空间数据结构,另一方面,从抽象数据类型的角度,用面向对象观点来讨论数据结构,已成为新的发展趋势。

 2.数据结构课程学习特点

《数据结构》课程教学目标要求学生学会分析数据对象特征,掌握数据组织方法和计算机的表示方法,以便为应用所涉及数据选择适当的逻辑结构、存储结构及相应算法,初步掌握算法时间空间分析的技巧,培养良好的程序设计技能。

第2章 线性表

[教学目标]

线性结构是一种最基本的数据结构,熟练掌握其逻辑结构、存储结构各种运算。

[重点、难点]

链表结构,重点掌握单链表、循环链表、双向链表,初步掌握静态链表。

[教学方法]

首先给出线性表的抽象数据类型定义,然后分别用顺序结构和链表结构实现线性表,最后给出一个应用实例。

[学习要点]

1.了解线性表的逻辑结构特性是数据元素之间存在着线性关系,在计算机中表示这种关系的两类不同的存储结构是顺序存储结构和链式存储结构。

用前者表示的线性表简称为顺序表,用后者表示的线性表简称为链表。

2.熟练掌握这两类存储结构的描述方法,如一维数组中一个区域[i..j]的上、下界和长度之间的变换公式(L=j-i+1,i=j-L+1,j=i+L-1),链表中指针p和结点*p的对应关系(结点*(p->next)是结点*p的后继等),链表中的头结点、头指针和首元结点的区别及循环链表、双向链表的特点等。

链表是本章的重点和难点。

扎实的指针操作和内存动态分配的编程技术是学好本章的基本要求。

3.熟练掌握线性表在顺序存储结构上实现基本操作:

查找、插入和删除的算法。

4.熟练掌握在各种链表结构中实现线性表操作的基本方法,能在实际应用中选用适当的链表结构。

5.能够从时间和空间复杂度的角度综合比较线性表两种存储结构的不同特点及其适用场合。

2.1 线性表的概念及运算

2.1.1 线性表的逻辑结构

线性表是n个类型相同的数据元素的有限序列,数据元素之间是一对一的关系,即每个数据元素最多有一个直接前驱和一个直接后继。

2.1.2 线性表的抽象数据类型定义

一个抽象数据类型定义了一个模型,但不涉及模型的具体实现问题。

2.2 线性表的顺序存储

2.2.1 线性表的顺序存储结构

线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素,使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中。

采用顺序存储结构的线性表通常称为顺序表。

2.2.2 线性表顺序存储结构上的基本运算

1.查找操作

线性表有两种基本的查找运算。

按序号查找GetData(L,i):

要求查找线性表L中第i个数据元素,其结果是L.elem[i-1]或L->elem[i-1]。

按内容查找Locate(L,e):

要求查找线性表L中与给定值e相等的数据元素,其结果是:

若在表L中找到与e相等的元素,则返回该元素在表中的序号;若找不到,则返回一个“空序号”,如-1。

2.      插入操作

线性表的插入运算是指在表的第i(1≤i≤n+1)个位置,插入一个新元素e,使长度为n的线性表(e1,…,ei-1,ei,…,en)变成长度为n+1的线性表(e1,…,ei-1,e,ei,…,en)。

3.删除操作

线性表的删除运算是指将表的第i(1≤i≤n)个元素删去,使长度为n的线性表 (e1,…,ei-1,ei,ei+1,…,en),变成长度为n-1的线性表(e1,…,ei-1,ei+1,…,en)。

2.3 线性表的链式存储

采用链式存储结构的线性表称为链表。

2.3.1 单链表

链表是用一组任意的存储单元来存放线性表的结点,在存储线性表的每个数据元素值的同时,存储指示其后继结点的地址(或位置)信息,这两部分信息组成的存储映象叫做结点(Node),如图2.5所示。

图2.5 单链表的结点结构

它包括两个域:

数据域用来存储结点的值;指针域用来存储数据元素的直接后继的地址(或位置)。

由于链表的每个结点只有一个指针域,故将这种链表又称为单链表。

应设一个头指针H指向第一个结点,由于表中最后一个结点没有直接后继,则指定线性表中最后一个结点的指针域为“空”(NULL)。

例如:

图2.6所示为线性表(A,B,C,D,E,F,G,H)的单链表存储结构,整个链表的存取需从头指针开始进行,依次顺着每个结点的指针域找到线性表的各个元素。

 

 

 

 

 

 

 

 

 

 

 

图2.6单链表的示例图

 

 有时为了操作的方便,还可以在单链表的第一个结点之前附设一个头结点,头结点的数据域可以存储一些关于线性表的长度的附加信息,也可以什么都不存;而头结点的指针域存储指向第一个结点的指针。

此时带头结点单链表的头指针就不再指向表中第一个结点而是指向头结点。

如果线性表为空表,则头结点的指针域为“空”,如图2.8所示。

                                                                                      

 

                            

(a)带头结点的空单链表

 

 

(b)带头结点的单链表

图2.8带头结点单链表图示

2.3.2 单链表上的基本运算

1.建立单链表

动态建立单链表的常用方法有如下两种:

1)头插法建表

算法描述:

从一个空表开始,重复读入数据,生成新结点,将读入数据存放到新结点的数据域中,然后将新结点插入到当前链表的表头结点之后,直至读入结束标志为止。

2)尾插法建表

该方法是将新结点插到当前链表的表尾上。

为此需增加一个尾指针r,使之始终指向当前链表的表尾。

2.查找

1)按序号查找

算法描述:

设带头结点的单链表的长度为n,要查找表中第i个结点,则需要从单链表的头指针L出发,从头结点(L->next)开始顺着链域扫描,用指针p指向当前扫描到的结点,初值指向头结点(pL->next),用j做记数器,累计当前扫描过的结点数(初值为0),当j=i时,指针p所指的结点就是要找的第i个结点。

2) 按值查找

算法描述:

按值查找是指在单链表中查找是否有结点值等于e的结点,若有的话,则返回首次找到的其值为e的结点的存储位置,否则返回NULL。

3.单链表插入操作

算法描述:

要在带头结点的单链表L中第i个数据元素之前插入一个数据元素e,需要首先在单链表中找到第i-1个结点并由指针pre指示,然后申请一个新的结点并由指针s指示,其数据域的值为e,并修改第i-1个结点的指针使其指向s,然后使s结点的指针域指向第i个结点。

4.删除

算法描述:

欲在带头结点的单链表L中删除第i个结点,则首先要通过计数方式找到第i-1个结点并使p指向第i-1个结点,而后删除第i个结点并释放结点空间。

删除过程如图2.12所示。

2.3.3 循环链表

循环链表:

是一个首尾相接的链表。

其特点是将单链表最后一个结点的指针域由NULL改为指向头结点或线性表中的第一个结点,就得到了单链形式的循环链表,并称为循环单链表。

                            (a)带头结点的循环单链表的一般形式

 (b)带尾结点的循环单链表的一般形式

2.3.4 双向链表

链表中就有两条方向不同的链,我们称之为双(向)链表(DoubleLinkedList)。

                   图2.14 双链表的结点结构

1、双向链表的前插操作

2、双向链表的删除操作

算法描述:

欲删除双向链表中的第i个结点,则指针的变化情况如图所示:

 

图2.17双向链表的删除操作

 2.4 一元多项式的表示及相加

对于符号多项式的各种操作,实际上都可以利用线性表来处理。

比较典型的是关于一元多项式的处理。

在数学上,一个一元多项式Pn(x)可按升幂的形式写成:

Pn(x)=p0+p1x+p2x2+p3x3+…+pnxn

(2)通过键盘输入一组多项式的系数和指数,以输入系数0为结束标志,并约定建立多项式链表时,总是按指数从大到小的顺序排列。

算法描述:

从键盘接受输入的系数和指数;用尾插法建立一元多项式的链表。

第3章 限定性线性表—栈和队列

[教学目标] 

栈和队列是两种限定性线性表,在编译程序、操作系统等各种软件系统中应用广泛。

熟练掌握逻辑、存储结构。

[重点、难点]

要求重点掌握利用栈和队列解决实际问题的方法。

[教学方法]

用栈和队列的典型应用引出栈和队列的抽象数据类型定义、分别用顺序结构和单链表结构实现栈和队列,栈与递归的实现。

[学习要点]

1.掌握栈和队列这两种抽象数据类型的特点,并能在应用问题中正确选用它们。

2.熟练掌握栈类型的两种实现方法,即两种存储结构表示时的基本操作实现算法,特别应注意栈满和栈空的条件以及它们的描述方法。

3.熟练掌握循环队列和链队列的基本操作算法,特别注意队满和队空的描述方法。

4.理解递归算法执行过程中栈的状态变化过程。

3.1 栈

3.1.1 栈的定义

栈又称为后进先出的线性表,简称为LIFO表。

在日常生活中也可以见到很多“后进先出”的例子,如:

手枪子弹夹中的子弹,子弹的装入与子弹弹出膛均在弹夹的最上端进行,先装入的子弹后发出,而后装入的子弹先发出。

又如:

铁路调度站,都是栈结构的实际应用。

 

 

 

 

 

 

 

 

 

3.1.2 栈的表示和实现

1.顺序栈

顺序栈是用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时由于栈的操作的特殊性,还必须附设一个位置指针top(栈顶指针)来动态地指示栈顶元素在顺序栈中的位置。

通常以top=-1表示空栈。

⑴    初始化。

void InitStack(SeqStack*S)

{/*构造一个空栈S*/

 S->top=-1;

}

⑵判栈空。

intIsEmpty(SeqStack*S)    /*判栈S为空栈时返回值为真,反之为假*/

{

return(S->top==-1?

TRUE:

FALSE);

}

 ⑶    判栈满。

intIsFull(SeqStack*S)

{

   return(S->top==Stack_Size?

TRUE:

FALSE);

}

 ⑷    进栈。

intPush(SeqStack*S,StackElementTypex)

{

 if(S->top==Stack_Size-1) return(FALSE); /*栈已满*/

S->top++;

S->elem[S->top]=x;

return(TRUE);

}

⑸    出栈。

intPop(SeqStack*S,StackElementType*x)

{ /*将栈S的栈顶元素弹出,放到x所指的存储空间中*/

if(S->top==-1) /*栈为空*/

return(FALSE);

             else

{

 *x=S->elem[S->top];

S->top--;   /*修改栈顶指针*/

 return(TRUE);

}

}

⑹    取栈顶元素。

intGetTop(SeqStack*S,StackElementType*x)

{ /*将栈S的栈顶元素弹出,放到x所指的存储空间中,但栈顶指针保持不变*/

       if(S->top==-1) /*栈为空*/

return(FALSE);

             else

{

 *x=S->elem[S->top];

 return(TRUE);

}    

}

思考题:

说明读栈顶元素的算法与退栈顶元素的算法的区别,并请写出读栈顶算法。

2.链栈

链栈即采用链表作为存储结构实现的栈。

⑴    进栈操作。

intPush(LinkStacktop,StackElementTypex)

/*将数据元素x压入栈top中*/ 

{

 LinkStackNode*temp;

 temp=(LinkStackNode*)malloc(sizeof(LinkStackNode));

  if(temp==NULL) return(FALSE);  /*申请空间失败*/

   temp->data=x;

   temp->next=top->next;

top->next=temp;  /*修改当前栈顶指针*/

return(TRUE);

}

⑵    出栈操作。

intPop(LinkStacktop,StackElementType*x)

{ /*将栈top的栈顶元素弹出,放到x所指的存储空间中*/

LinkStackNode*temp;

temp=top->next;

if(temp==NULL) /*栈为空*/

      return(FALSE);

top->next=temp->next;

*x=temp->data;

free(temp);  /*释放存储空间*/

return(TRUE);

}

思考题:

将可利用空间组成链栈,常用的申请一个新结点(如C语言中的mallock函数)与归还一个无用结点(如C语言中的free函数)操作,对可利用空间的链栈来说,分别相当做什么操作?

 

3.1.3 栈的应用举例

栈应用的典型例子。

1.括号匹配问题

假设表达式中包含三种括号:

圆括号、方括号和花括号,它们可互相嵌套,如([{}]([]))或({([][( )])})等均为正确的格式,而{[]})}或{[()]或([]}均为不正确的格式。

在检验算法中可设置一个栈,每读入一个括号,若是左括号,则直接入栈,等待相匹配的同类右括号;若读入的是右括号,且与当前栈顶的左括号同类型,则二者匹配,将栈顶的左括号出栈,否则属于不合法的情况。

另外,如果输入序列已读尽,而栈中仍有等待匹配的左括号,或者读入了一个右括号,而栈中已无等待匹配的左括号,均属不合法的情况。

当输入序列和栈同时变为空时,说明所有括号完全匹配。

2.算术表达式处理规则:

一、规定优先级表

二、设置两个栈:

OVS(运算数栈)、OPTR(运算符栈)

三、自左向右扫描,遇操作数进OVS(运算数栈),操作符则与OPTR(运算符栈)栈顶优先数比较:

当前操作符>OPTR栈顶,当前操作符进OPTR栈,前操作符≤OPTR栈顶.

图3.7 A/B↑C+D*E的运算过程时栈区变化情况栈区变化示意图

3.2.1 队列的定义

队列(Queue)是另一种限定性的线性表,它只允许在表的一端插入元素,而在另一端删除元素,所以队列具有先进先出(FistInFistOut,缩写为FIFO)的特性。

在队列中,允许插入的一端叫做队尾(rear),允许删除的一端则称为队头(front)。

3.2.2 队列的表示和实现

1.链队列

用链表表示的队列简称为链队列。

 

 

(1)初始化操作。

intInitQueue(LinkQueue*Q)

{/*将Q初始化为一个空的链队列*/

 Q->front=(LinkQueueNode*)malloc(sizeof(LinkQueueNode));

 if(Q->front!

=NULL)

        {

               Q->rear=Q->front;

               Q->front->next=NULL;

                     return(TRUE);

        }

 else     return(FALSE);   /*溢出!

*/

}

(2)入队操作。

intEnterQueue(LinkQueue*Q,QueueElementTypex)

{ /*将数据元素x插入到队列Q中*/

LinkQueueNode *NewNode;

NewNode=(LinkQueueNode*)malloc(sizeof(LinkQueueNode));

if(NewNode!

=NULL)

{

  NewNode->data=x;

  NewNode->next=NULL;

  Q->rear->next=NewNode;

  Q->rear=NewNode;

return(TRUE);

}

  else return(FALSE);   /*溢出!

*/

}

(3)出队操作。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 教育学心理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1