当前位置:文档之家› 数据结构教案C语言版

数据结构教案C语言版

数据结构教案C语言版
数据结构教案C语言版

数据结构教案C语言版 Last updated on the afternoon of January 3, 2021

课程教案

课程名称:数据结构

授课教师:

学习对象:

任课时间:

一、学生情况分析

数据结构是计算机专业的一门核心专业课程。学生在前期的学习中已经学习了C语言程序设计课程。通过本课程学习使学生对提高编写程序的能力以及解决实际问题的能力。

二、课程教学目标

《数据结构》是计算机学科中一门核心专业基础课。主要介绍如何合理地组织数据、有效地存储和处理数据,正确地设计算法以及对算法的分析和评价。通过本课程的学习,使学生深透地理解数据结构的逻辑结构和物理结构的基本概念以及有关算法,培养基本的、良好的程序设计技能,编制高效可靠的程序,为学习操作系统、编译原理和数据库等课程奠定基础。

三、课程教学内容

第一章绪论

教学内容:

1)什么是数据结构

2)抽象数据类型概念;数据类型;数据抽象与抽象数据类型;用于描述数据结构的语言

3)数据结构的抽象层次

4)算法定义

5)性能分析与度量;算法的性能标准;算法的后期测试;算法的事前估计;空间复杂度度量;时间复杂度度量;时间复杂度的渐进表示法;

教学要求:

了解:数据结构基本概念及数据结构的抽象层次

了解:抽象数据类型概念

了解:算法的定义及算法特性

掌握:算法的性能分析与度量方法

第二章线性表

教学内容:

1)线性表的定义和特点

2)线性表的顺序存储及查找、插入和删除操作

3)线性表的链式存储及查找、插入和删除操作

4)使用线性表的实例

教学要求:

了解:线性表的定义和特点

熟练掌握:线性表的顺序存储结构的查找、插入和删除等基本操作

熟练掌握:单链表、循环链表及双向链表的定义及实现

掌握:熟练掌握单链表的应用方法

第三章栈和队列

教学内容:

1)栈:栈的抽象数据类型;栈的顺序存储表示;栈的链式存储表示2)队列:队列的抽象数据类型;队列的顺序存储表示;队列的链式存储表示

3)队列的应用举例

教学要求:

熟练掌握:栈的定义及实现

熟练掌握:队列的定义及实现

掌握:能运用栈和队列解决简单实际问题

第四章串

教学:内容:

1)字符串的抽象数据类型

2)字符串操作的实现

3)字符串的模式匹配

教学要求:

熟练掌握:字符串的定义方式

熟练掌握:字符串的各种操作的实现

了解:字符串的模式匹配算法

第五章数组和广义表

教学:内容:

1)数组的定义和初始化

2)作为抽象数据类型的数组的顺序存储方式

教学要求:

了解:作为抽象数据类型的数组的定义

熟练掌握:顺序表的数组定义方式及实现

第六章树和二叉树

教学内容:

1)树和森林的概念:树的定义;树的术语;树的抽象数据类型;森林

的概念

2)二叉树:二叉树的定义;二叉树的性质;二叉树的抽象数据类型

3)二叉树的表示:数组表示;链表存储表示

4)二叉树的遍历:中序遍历;前序遍历;后序遍历;应用二叉树遍历

的实例;二叉树的中序非递归算法

5)线索化二叉树:线索;中序线索化二叉树;前序与后序的线索化

6)树与森林:树的存储表示;森林与二叉树的转换;树的遍历;森林

的遍历

7)二叉树的计数

8)霍夫曼树:路径长度;霍夫曼树;霍夫曼树编码

教学要求:

了解:树和森林的概念

掌握:二叉树的概念、性质及二叉树的表示

熟练掌握:二叉树的遍历方法

掌握:线索化二叉树的特性及寻找某结点的前驱和后继的方法

掌握:树和森林的实现及遍历方法

掌握:二叉树的计数方法及从二叉树遍历结果得到二叉树的方法

掌握:霍夫曼树的实现方法及霍夫曼编码的概念

第七章图

教学内容:

1)图的基本概念:图的基本概念;图的抽象数据类型

2)图的存储表示:邻接矩阵;邻接表;邻接多重表

3)图的遍历与连通性;深度优先搜索;广度优先搜索;连通分量

4)最小生成树:克鲁斯卡尔算法;普里姆算法

教学要求:

掌握:图的基本概念和图的存储表示

熟练掌握:图的两种遍历方法与求解连通性问题的方法

掌握:构造最小生成树的Prim和Kruskal方法

第九章查找

教学内容:

1)静态查找表:顺序表的查找;有序表的查找;索引顺序表的查找

2)二叉排序树:二叉排序树上的搜索、插入和删除

教学要求:

熟练掌握:静态搜索表的顺序搜索和折半搜索方法

熟练掌握:二叉搜索树的表示、搜索、插入、删除算法及其性能分析方法

第十章内部排序

教学内容:

1)概述

2)插入排序:直接插入排序;对分插入排序;链表插入排序;希尔排

3)选择排序:直接选择排序;堆排序

教学要求:

掌握:排序的基本概念和性能分析方法

掌握:插入排序、选择排序、等内排序的方法及性能分析方法

单元名称:第一讲:绪论

一、教学目标

1.了解《数据结构》课程的体系结构

2.掌握本章介绍的各种基本概念和术语

3.了解数据结构的二元组表示

4.掌握逻辑结构与物理结构之间的映像关系。

二、重点与难点

重点:数据结构的基本概念;逻辑结构与物理结构之间的映像关系。

难点:逻辑结构与物理结构之间的映像关系。

三、教学内容与教学过程

介绍本学期课程的内容及安排

本课程是计算机专业的重要专业课之一,主要介绍常用的数据结构以及相关算法。本课程主要讲授线性表、栈和队列、串、数组、树和二叉树、图、查找、排序等内容。

成绩考核方式为:期末成绩+平时成绩,其中期末成绩占70%,平时成绩占30%,平时成绩为:作业成绩+出勤率+上机成绩。

讲授新课

1.1什么是数据结构

讲解:(数据结构课程的研究背景)

从计算机最初以数值计算为主到大量非数值计算出现引出数据结构。

讲解:(数据结构课程的研究对象)

例1-1图书馆的书目检索系统自动化问题。

1-2计算机和人机对奕问题

1-3多叉路口交通灯的管理问题

总结:

从以上三个例子可以看出,描述这类非数值计算问题的数学模型不再是数学方程,而

是诸如线性表、树和图等之类的数据结构,这些都是数据结构课程的研究对象。因此,简单地说,数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等等的学科。

介绍数据结构课程的发展以及与其他课程之间的关系。

基本概念和术语

基本概念:数据、数据元素、数据项、数据对象、数据结构、结构

(1)常见基本结构(逻辑结构):集合、线性结构、树形结构、图状结构或网状结构

数据结构的形式定义:

数据结构一般用一个二元组来表示:

Data_Structure=(D,S)

其中:D是数据元素的有限集,S是D上的关系的有限集

DS表示一种数据结构,它由数据元素集合K和在K上定义的一种二元关系的集合R所组成。其中:

n

=n

K

K

i

}0

,

0|

{≥

i是数据元素的有限集合,n为DS中数据元素的个数。

=m

j

R

R

m

}0

,

0|

{≥

j是K上关系的有限集合,m为K上关系的个数,通常情况下m的取值为1。

K上任何一个二元关系Rj是序偶的集合。对于Rj中的任一序偶(x,

y∈K),称x为第一个元素(或y的前驱),y为第二个元素(或x的后继)。

数据结构中的数据元素和数据元素之间的关系还可以用图形直观地表示出来。图形中的每个结点对应一个数据元素,两结点之间带箭头的连线对应二元关系中的一个序偶,其中序偶的第一个元素称为弧尾,第二个元素称为弧头。

举例讲解:

例数据结构line={K,R},其中K={01,02,03,04,05,06,07,08,09,10},R={r},r={<01,02>,<02,03>,<03,04>,<04,05>,<05,06>,<06,07>,<07,08>,<08,09>,<09,10>}。

例数据结构tree={K,R},其中K={01,02,03,04,05,06,07,08,09,10},R={r},r={<01,02>,<01,03>,<01,04>,<02,05>,<02,06>,<04,07>,<04,08>,<06,09>,<06,10>}。

例数据结构graph={K,R},其中K={01,02,03,04,05},R={r},r={<01,02>,<02,01>,<01,04>,<04,01>,<01,03>,<03,01>,<02,04>,<04,02>,<03,05>,<05,03>}。

介绍常见数据结构(集合、线性结构、树型结构、图型结构)具体表示方式

(2) 逻辑结构

上述数据结构的定义是对操作对象的一种数学描述,是从操作对象抽象出来的数学模型。结构定义中的“关系”描述的是数据元素之间的逻辑关系,因此又称为数据的逻辑结构。根据这种逻辑关系通常将数据结构划分为线性结构和非线性结构,其中非线性结构又分为树型结构和图型结构。

(3) 物理结构

数据结构在计算机中的表示(存储映象)称为数据的物理结构或存储结构,它涉及到数据元素及其相互关系在计算机内部的表示形式。数据元素之间的关系在计算机中有两种不同的表示方法:顺序映像和非顺序映像。根据数据元素相互之间的关系在计算机中的表示形式将数据的物理结构划分为顺序结构和链式结构。

顺序映像的特点是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系。非顺序映像的特点是借助指示元素存储地址的指针表示数据元素之间的逻辑关系。

注意:数据的逻辑结构和物理结构是密切相关的两个方面,任何一个算法的设计取决于选定的数据的逻辑结构,而算法的实现依赖于采用的存储结构。

(4)数据结构一般包括三方面内容:

数据的逻辑结构、数据的存储结构、数据的运算(举例讲解)

小结:总结本讲的主要内容

四、作业布置

见习题集

单元名称:第二讲:线性表的类型定义,线性表的顺序存储一、教学目标

掌握线性表的顺序表示和实现

二、重点与难点

线性表的顺序表示和实现。

三、教学过程的具体安排

讲授新课

线性表的类型定义

线性表的定义:一个线性表是n 个数据元素的有限序列。其中每个数据元素的具体含义,在不同的情况下各不相同,但是同一线性表中的元素必定具有相同特性,即属于同一数据对象。例如:26个英文字母表;学生健康情况登记表(图)等。

例如线性表(a 1,…,a i-1,a i ,a i+1,…,a n ),称a i-1是a i 的直接前驱元素, a i+1是 a i 的直接后继。引导学生自己总结线性结构的特点。

线性表的长度:线性表中元素的个数(n ≥0),n=0为空表。 线性表中数据元素的位序(如数据元素a i 在线性表中的位序为i )。

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

讲解定义中的数据对象,数据关系以及基本操作(教材P19),重点讲解常用的基本操作含义。

通过示例2-1,2-2讲解更复杂的基本操作,并分析时间复杂度。

线性表的顺序表示和实现

(1)线性表的顺序表示:用一组地址连续的存储单元依次存储线性表的数据元素。

(2)顺序储存的地址关系:假设线性表的每个元素需占用l 个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储位置。则线性表中第i+1个数据元素的存储位置LOC( a i+1)和第i 个数据元素的存储位置LOC(a i )之间满足下列关系:

LOC(a i+1)=LOC(a i )+l

线性表的第i 个数据元素a i 的存储位置为:

LOC(a i )=LOC(a 1)+(i-1)*l ,其中LOC(a 1)为线性表的基地址。

(3)顺序表及其特点, 顺序储存结构是一种随机存取的存储结构。

(4)线性表的动态分配顺序存储结构。

#define LIST_INIT_SIZE 100

#define LISTINCREMENT 10

Typedef struct {

ElemType *elem;

int length;

int listsize;

}SqList;

(1) 基于顺序存储结构的基本操作的实现

主要介绍下面的基本操作并且分析时间复杂度。

InitList_Sq(SqList &L);ListInsert_Sq(SqList &L, int i, ElemType e);

ListDelete_Sq(SqList &L, int i, ElemType &e);LocateElem_Sq(SqList L,

ElemType e, Status (*compare)(ElemTyp e, ElemType));MergeList_Sq(SqList La,SqList Lb, SqList &Lc);

重点讲解:

顺序存储结构上实现线性表的插入操作 设线性表()n i i i a a a a a a A ,,,,,,,1121 +-=,为了保证线性表的有序性,当在位置i ()11+≤≤n i 之前插入一个新的数据元素x 时,需要将第i 个到第n 个数据元素均向后移动一个位置,然后将数据元素x 存储到第i 个位置上并改变线性表的长度。

Status ListInsert_Sq(SqList &L, int i, ElemType e) {

)(2/)1/()210()(n O n n n n f ==+++++= ()n i i i a a a a a a A ,,,,,,,1121 +-=)1(n i i ≤≤())(2/1/))1(210()(n O n n n n f =-=-++++= 2.3.1线性表的单链表存储结构的C 语言描述:

typedef struc LNode{ ()n P x i P ()m Q x ()()()n n m R x P x Q x =+n m > 3.1.1.,n, n ≥0 } 数据关系:R1={ | ai-1, ai ∈D, i=2,...,n }约定an 端为栈顶, a1 端为栈底。

基本操作:

InitStack(&S)

DestroyStack(&S) ClearStack(&S) StackEmpty(S)

StackLength(S) GetTop(S, &e) Push(&S, e) Pop(&S, &e)

} ADT Stack

3.1.2 栈的表示和实现

顺序栈

类似于线性表的顺序映象实现,指向表尾的指针可以作为栈顶指针。

栈的顺序存储表示:

#define STACK_INIT_SIZE 100;

#define STACKINCREMENT 10;

typedef struct {

SElemType *base;

SElemType *top;

int stacksize;

} SqStack;

顺序栈的基本操作的算法描述:

初始化,返回栈顶元素,入栈,出栈。

(a) 栈空栈满条件

栈空条件:top=base

栈满条件:base-top=stacksize

(b) 入栈操作

Status Push (SqStack &S, SElemType e) {

if ) exit(OVERFLOW);

=+;

+=STACKINCREMENT;

}

*++ = e;

return OK;

}

(c) 出栈操作

Status Pop (SqStack &S, SElemType &e) {

if == return ERROR;

e=*;

return OK;

}

链栈:栈的链式存储结构。栈顶指针就是链表的头指针

栈的链式存储结构类似单链表的存储结构,链表中第一个结点表示栈顶,最后一个结点表示栈底。由于链表的长度可以动态增长,因此进行入栈操作时无需考虑栈的上溢,但进行出栈操作时,必需考虑栈的下溢,下溢的条件是top 的值为0。

链式栈的入栈操作

Status Push(LinkList &top, ElemType x){

p=(LinkList *)malloc(sizeof(LNode));

p->data=x; p->next=top; top=p; return OK;

}

(2) 链式栈的出栈操作

Status Pop(LinkStack &top, ElemTye &y){

if (top==0) return ERROR;

p=top; y=p->data; top=p->next; free(p);

return OK;

}

小结;本讲主要介绍了栈的基本概念,栈的基本运算,栈在顺序存储结构和链式存储结构上实现基本操作。

四、作业布置

见习题集

实验作业见实验指导。

单元名称:第 六 讲:队列

一、教学目标

1.了解栈的基本概念和基本操作;

2.掌握栈的基本操作在两种存储结构上的实现。

二、重点与难点

栈的基本操作在两种存储结构上实现。

三、教学内容与教学过程

讲授新课

队列的基本概念

队列是一种限制所有插入操作在线性表的一端进行,而所有的删除操作在线性表的另一端进行的特殊线性表。允许插入(入队)操作的一端称为队尾,允许删除(出队)操作的一端称为队头。

设队列为12(,,

,)n q a a a =,则1a 是队头元素,n a 是队尾元素。队列中的元素按照12,,

,n a a a 的顺序进入队列的,退出队列也只能按照这个次序依次退出,即只有在121,,,n a a a -都退出队列后,n a 才能退出队列。因此队列也称为先进先出(FIFO )的线性表。

2、队列的基本操作

InitQueue(&Q) DestroyQueue(&Q) ClearQueue(&Q)

QueueEmpty(Q) QueueLength(Q) GetHead(Q, &e)

EnQueue(&Q, e) DeQueue(&Q, &e)

3、队列的顺序存储结构和循环队列

在队列的顺序存储结构中,除了用一组地址连续的存储单元依次存放从队头到队尾的元素之外,还需要附设两个指针front和rear。为了在C语言中描述方便起见,在此我们约定:初始化建立空队列时,令front=rear=0,每当插入新的队尾元素时,尾指针rear增1;每当删除队头元素时,头指针front增1。因此,在非空队列中,头指针始终指向队列头元素,尾指针始终指向队列尾元素的下一个位置。

讨论:将数据10,20,30,40,50,60按照入队列、入队列、入队列、出队列、出队列、入队列、入队列、入队列、出队列和出队列的顺序,观察队列中队头和队尾指针的变化状态。

假设当前为队列分配的最大空间为6,则不可再继续插入新的队尾元素,否则会因数组越界而导致程序代码被破环,然而,此时又不宜如顺序栈那样进行存储再分配扩大数组空间,因为队列的实际可用空间并末占满。解决这个问题的巧妙方法是将顺序队列的存储空间想象成一个逻辑上首尾相连的环状空间,这种存储结构称为循环队列。

分析课本P64图可知,=无法判断队列空间是“满”还是“空”。解决这个问题有两种方法:其一是另设一个标志位以区别队列是“空”还是“满”;其二是少用一个元素空间,约定以队头指针在队尾指针的下一个位置上作为队列“满”的标志。因此,判断队列空的条件为=;判断队列满的条件为 = +1) % MAXQSIZE。

(a) 顺序循环队列的类型描述

typedef struct { QElemType *base; int front; int rear; } SqQueue;

(b) 顺序循环队列的入队列操作

status EnQueue(SqQueue&Q, QelemType e){

if (+1)%MAXSIZE== return ERROR;

[]=e;

=+1)%MAXSIZE;

return OK;

}

(c) 顺序循环队列的出队列操作

status DeQueue(SqQueue &Q, QelemType &e) {

if == return ERROR;

e = [];

= +1)%MAXSIZE;

return OK;

}

4、队列的链式存储结构

队列的链式存储结构实际上是一个同时带有头指针和尾指针的单向链表,头指针指向队头元素,尾指针指向队尾元素。为了操作方便起见,给链式队列添加一个头结点。空的链式队列的判断条件为头指针和尾指针都指向头结点。

(a) 链式循环队列的类型描述

typedef struct QNode {

QElemType data;

struct QNode *next;

} QNode, *QueuePtr;

typedef struct {

QueuePtr front; 悉串的定义以及基本操作的定义,并能利用这些基本操作来实现串的其它各种操作的方法。

2.熟练掌握在串的定长顺序存储结构上实现串的各种操作的方法。

3.掌握串的堆分配存储结构以及在其上实现串操作的基本方法。

4.了解串的块链存储结构

二、重点与难点

串的存储结构以及基本操作的实现。

三、教学内容与教学过程

讲授新课

串类型的定义

(1)基本概念:

串(string):由零个或多个字符组成的有限序列,也称字符串。记为:

S = ‘a1a2a3……an’ (n≥0) 如:A= ‘BEIJING’,B= ‘JING’

串的长度:串中字符的数目n 。

空串:不含任何字符的串,串长度为0,

空格串:仅由一个或多个空格组成的串,长度为串中空格字符的个数。

如:‘ ’ ,C= ‘ BEI JING ’

子串:由串中任意个连续的字符组成的子序列。

主串:包含子串的串。如:A= ‘ BEIJING ’ B= ‘ JING ’

字符在串中的位置:字符在序列中的序号。

子串在主串中的位置:以子串的第一个字符在主串中的位置来表示。

如:A= ‘ BEIJING ’,B= ‘JING ’,B在A中的位置为4。

串相等:当且仅当两个串的值相等。也就是说,只有两个串的长度相等且各个对应位置的字符都相等时才相等。

(2)串的抽象数据类型定义:

ADT String {

数据对象:D={ ai |ai∈CharacterSet, i=1,2,...,n, n≥0 }

数据关系:R1={ < ai-1, ai > | ai-1, ai ∈D, i=2,...,n }

基本操作:(见教材P71)

} ADT String

通过基本操作可以实现更复杂的操作。如通过判等、求串长和求子串等操作可以实现定位函数Index。

串的表示和实现

4.2.1 定长顺序存储表示

用一组地址连续的存储单元存储串值的字符序列,类似于线性表的顺序存储结构。所谓定长顺序存储结构,是直接使用定长的字符数组来定义,数组的上界预先给出: #define MAXSTRLEN 255 4.2.24.2.3悉数组的定义。

2.掌握数组的顺序表示和基本操作的实现。

3.掌握特殊矩阵的压缩存储和稀疏矩阵三元组顺序表存储。

4.了解稀疏矩阵的行逻辑链接的顺序表和十字链表表示储存

二、重点与难点

数组的压缩存储。

三、教学内容与教学过程

讲授新课

数组的定义

数组的抽象数据类型定义:

ADT Array

{

数据对象:

数据关系:

基本操作:

}ADT Array

数组是一种数据类型。从逻辑结构上看,数组可以看成是一般线性表的扩充。二维数组

可以看成是线性表的线性表。举例

对于数组的操作一般只有两类:(与线性表对比讲解)

(1)获得特定位置的元素值;

(2)修改特定位置的元素值。

数组的顺序表示和实现

对于数组A,一旦给定其维数n及各维长度bi(1≤i≤n),则该数组中元素的个数是固

定的,不可以对数组做插入和删除操作,不涉及移动元素操作,因此对于数组而言,采用顺序存储法比较合适。

数组的顺序存储结构有两种:一种是按行序存储,如高级语言BASIC、COBOL和

PASCAL语言都是以行序为主。另一种是按列序存储,如高级语言中的FORTRAN语言就是以列序为主。

以二维数组为例,假设每个元素只占L个存储单元,“以行为主”存放数组,下标从

0开始,首元素a00的地址为Loc[0,0] 求任意元素aij的地址,可由如下计算公式得到:

Loc[i,j]=Loc[0,0]+b2×i+j 其中b2为第二维的长度。

对于n维数组我们只要把上式推广,就可以容易地得到n维数组中任意元素aj1j2…jn的存

储地址的计算公式。

Loc[j1,j2,…jn]=Loc[0,0,…,0]+ ∑=

n

i

i

i

j

c

1

其中c n=L,c i-1=b i×c i, 1

特殊矩阵的压缩存储

特殊矩阵压缩存储的压缩原则是:对有规律的元素和值相同的元素只分配一个存储单元,

对于零元素不分配空间。

(1)对称矩阵满足条件:aij=aji 1≤i,j≤n

(2)三角矩阵

(3)带状矩阵

使用一维数组存储以上特殊矩阵,通过示例讲解矩阵中元素与一维数组中元素的对应关系。

稀疏矩阵

稀疏矩阵:指矩阵中大多数元素为零的矩阵。一般地,当非零元素个数只占矩阵元素总

数的5或低于这个百分数时,我们称这样的矩阵为稀疏矩阵。

(1)稀疏矩阵的三元组表表示法

对于稀疏矩阵的压缩存储要求在存储非零元素的同时,还必须存储该非零元素在矩阵中所处的行号和列号。我们将这种存储方法叫做稀疏矩阵的三元组表示法。

稀疏矩阵的三元组顺序存储表示

#define MAXSIZE 1000 typedef struct

{int i, j;

ElementType e;}Triple;

typedef struct

{Triple data[MAXSIZE+1];

int mu, nu, tu;

}TSMatrix;

用三元组表实现稀疏矩阵的转置运算

矩阵转置:指变换元素的位置,把位于(row,col)位置上的元素换到(col ,row)位置上,也就是说,把元素的行列互换。

用三元组实现稀疏矩阵转置运算的两种方式

重点掌握第一种方式:由转置后的矩阵中元素在三元组中的次序依次在转置前的矩阵中找到相应的三元组进行转置。通过程序结合矩阵进行讲解。

(2)矩阵的行逻辑链接的顺序表(了解)(3)十字链表表示(了解)

小结:总结本讲的主要内容

四、作业布置

见习题集

实验作业见实验指导。

相关主题
文本预览
相关文档 最新文档