成人函授教育.docx
《成人函授教育.docx》由会员分享,可在线阅读,更多相关《成人函授教育.docx(71页珍藏版)》请在冰豆网上搜索。
![成人函授教育.docx](https://file1.bdocx.com/fileroot1/2023-1/4/b169a723-4939-4fb4-898c-1e05bcb238ff/b169a723-4939-4fb4-898c-1e05bcb238ff1.gif)
成人函授教育
成人函授教育
《数据结构》自学指导书
适用计算机专业、本(专)科
黑龙江科技学院成教院
目录
一、前言………………………………………………………2
二、自学指导……………………………………………………3
三、各章节自学参考……………………………………………4
第一章数据结构基本概念及简单的算法分析…………4
第二章线性表……………………………………………5
第三章栈和队列…………………………………………10
第四章串…………………………………………………11
第五章数组和广义表……………………………………12
第六章树和二叉树………………………………………13
第七章图…………………………………………………17
第八章查找………………………………………………19
第九章排序………………………………………………22
四、期末考试试题类型说明…………………………………..34
一、前言
1、本课程的性质和任务
《数据结构》课程是计算机专业的一门专业基础课。
它涉及在计算机中如何有效地表示数据,如何合理地组织数据和处理数据。
内容包括:
线性表、链表、栈和队列、串、数组和广义表,树和二叉树、图、查找、排序等。
还涉及初步的算法设计和算法性能分析技术。
学好数据结构课程,将为后续的专业课程,如数据库系统、操作系统、编译原理等,打下良好的知识基础,而且还为软件开发和程序设计提供了必要的技能训练。
本课程要求学员对计算机的组成有基本的了解,对程序设计方法有一定基础,对c语言编程,有一定的了解。
对涉及离散数学的知识,如表、树、图、集合等,有初步的了解。
事实上,课程讲授中将会简单地补充这些方面的内容。
2、本课程的自学方法
(1)考虑到函授学员的特点,对数据结构及算法设计的要求不能象本科生那样。
因此,课程教学重点是介绍各种常用的数据结构及其实现。
在每节授课过程中,首先提示本节应掌握的概念,再给出结构的类(抽象数据类型)定义和主要操作的实现。
在讨论算法时主要给出算法实现的思路,以及算法实现的框架。
在每一节最后,对讨论过的内容做一小结,提示本节的要点及容易出错的地方。
使学员能够切实掌握每一种数据结构的特点和实现。
(2)按照《数据结构》课程教学大纲的要求,课程的讲授将从面向过程的概念、数据结构的层次开始。
从线性结构到非线性结构,从简单到复杂,循序渐进,逐步深入。
(3)学好一门课程,教师的引导固然十分重要,但主要靠学员的自身努力。
课堂教学可以起到画龙点睛的作用,但只有不断练习,才能巩固、掌握课程的内容。
因此,本课程要求学员积极独立完成所布置的习题。
3、主要教学环节
考试说明:
(1)在教学大纲和考核说明所规定的知识范围内命题。
在教学知识范围之内,需要灵活运用才能够解决问题的试题不属于超纲。
(2)试题的考察要求覆盖面广、区分度高。
(3)试题兼顾各个能力层次,理解占40%,简单运用占40%,综合运用占20%。
(4)试题的难易程度和题量适当,按难易程度分为四个层次:
容易占25%,较易占35%,较难占25%,难占15%。
题量安排以平时能够独立完成作业者,使他们能在规定的考试时间内做完并有一定时间检查为原则。
本课程使用的教材为《数据结构——C语言描述》,本教材充分起到了自学、助学和导学作用,系统地、完整地介绍各种数据结构的特点、实现及应用。
教材为:
《数据结构——C语言描述》耿国华等编著;西安电子科技大学出版社,2002年2月出版。
适用专业层次:
本科。
二、自学进度表
自学进度要求
面授
时数
备注
周次
日期
预习重点
自学各章节内容
自学
时数
1
线性表
栈和队列
第一章绪论
第二章线性表
第三章栈和队列
7
7
作业
2.2、2.3、3.1、3.2
2
串
数组和广义表
第四章串
第五章数组和广义表
4
4
作业
4.4
3
树和二叉树
第六章树和二叉树
4
4
6.9、6.11
4
图
第七章图7.1-7.4
3
3
7.1、7.3
5
图
查找
第七章图7.5-7.6
第八章查找8.1-8.2
3
3
7.6、
8.2、8.4
6
查找
第八章查找8.3-8.4
3
3
8.5、8.11
7
内部排序
第九章内部排序
3
3
9.1、9.2
8
内部排序
外部排序
第九章内部排序
第十章外部排序
3
3
9.7、9.18
10.5
三、主要章节指导及说明
第一章数据结构基本概念及简单的算法分析
1、教学内容:
什么是数据结构;
抽象数据类型及面向对象概念:
数据类型;数据抽象与抽象数据类型;面向过程的概念;用于描述数据结构的语言;
数据结构的抽象层次;
算法定义;
性能分析与度量:
算法的性能标准;空间复杂度度量;时间复杂度度量;
2、教学要求:
了解:
什么是数据、数据对象、数据元素、数据结构、数据的逻辑结构与物理结构、逻辑结构与物理结构间的关系;
了解:
什么是数据类型、抽象数据类型、数据抽象和信息隐蔽原则。
了解:
算法的定义、算法的特性、算法的时间代价、算法的空间代价
掌握:
用C语言描述算法的方法;
3、习题与解答:
(1)、什么是数据结构?
有关数据结构的讨论涉及哪三个方面?
【解答】
数据结构是指数据以及相互之间的关系。
记为:
数据结构={D,R}。
其中,D是某一数据对象,R是该对象中所有数据成员之间的关系的有限集合。
有关数据结构的讨论一般涉及以下三方面的内容:
1数据成员以及它们相互之间的逻辑关系,也称为数据的逻辑结构,简称为数据结构;
②数据成员极其关系在计算机存储器内的存储表示,也称为数据的物理结构,简称为存储结构;
3施加于该数据结构上的操作。
(2)、什么是算法?
算法的5个特性是什么?
试根据这些特性解释算法与程序的区别。
【解答】
通常,定义算法为“为解决某一特定任务而规定的一个指令序列。
”一个算法应当具有以下特性:
①有输入。
一个算法必须有0个或多个输入。
它们是算法开始运算前给予算法的量。
这些输入取自于特定的对象的集合。
它们可以使用输入语句由外部提供,也可以使用赋值语句在算法内给定。
②有输出。
一个算法应有一个或多个输出,输出的量是算法计算的结果。
③确定性。
算法的每一步都应确切地、无歧义地定义。
对于每一种情况,需要执行的动作都应严格地、清晰地规定。
④有穷性。
一个算法无论在什么情况下都应在执行有穷步后结束。
⑤有效性。
算法中每一条运算都必须是足够基本的。
就是说,它们原则上都能精确地执行,甚至人们仅用笔和纸做有限次运算就能完成。
算法和程序不同,程序可以不满足上述的特性(4)。
例如,一个操作系统在用户未使用前一直处于“等待”的循环中,直到出现新的用户事件为止。
这样的系统可以无休止地运行,直到系统停工。
(3)、设n为正整数,分析下列各程序段中加下划线的语句的程序步数
(1)for(inti=1;i<=n;i++)
for(intj=1;j<=n;j++){
c[i][j]=0.0;
for(intk=1;k<=n;k++)
c[i][j]=c[i][j]+a[i][k]*b[k][j];
}
第二章线性表
1、教学内容:
顺序表:
顺序表的定义和特点;顺序表的类型定义;顺序表的查找、插入和删除;
单链表:
单链表的结构;单链表的类型定义;单链表中的插入与删除;带表头结点的单链表;静态链表;
2、教学要求:
了解:
线性表的逻辑结构特性,以及线性表的两种存储实现方式;
了解:
链表与数组一样,是一种实现级结构。
有动态链表和静态链表之分;
掌握:
顺序表的定义与实现,包括搜索、插入、删除算法的实现及其平均比较次数的计算;
掌握:
单链表的类定义、构造函数、单链表的插入与删除算法
掌握:
双向链表的特点,双向链表的类定义及相关操作的实现,用双向链表解决问题的方法。
3、习题与解答:
(1)、将顺序表(a1,a2,...,an)重新排列为以a1为界的两部分:
a1前面的值均比a1小,a1后面的值都比a1大(这里假设数据元素的类型具有可比性,不妨设为整型),操作前后如图2.1所示。
这一操作称为划分。
a1也称为基准。
划分的方法有多种,下面介绍的划分算法其思路简单,性能较差。
【解答】:
从第二个元素开始到最后一个元素,逐一向后扫描:
(1)当前数据元素aI比a1大时,表明它已经在a1的后面,不必改变它与a1之间的位置,继续比较下一个。
(2)当前结点若比a1小,说明它应该在a1的前面,此时将它上面的元素都依次向下移动一个位置,然后将它置入最上方。
25
30
20
60
10
35
15
.
.
.
15
10
20
25
30
60
35
.
.
.
划分前划分后图2.1顺序表的划分算法如下:
voidpart(SeqList*L)
{inti,j;
datatypex,y;
x=L->data[0];/*将基准置入x中*/
for(i=1;i<=L->last;i++)
if(L->data[i]{y=L->data[i];
for(j=i-1;j>=0;j--)/*移动*/
L->data[j+1]=L->data[j];
L->data[0]=y;
}
}
算法2.1
本算法中,有两重循环,外循环执行n-1次,内循环中移动元素的次数与当前数据的大小有关,当第i个元素小于a1时,要移动它上面的i-1个元素,再加上当前结点的保存及置入,所以移动i-1+2次,在最坏情况下,a1后面的结点都小于a1,故总的移动次数为:
即最坏情况下移动数据时间性能为O(n2)。
这个算法简单但效率低,在第9章的快速排序中时我们将介绍另一种划分算法,它的性能为O(n)。
(2)、已知单链表H,写一算法将其倒置。
即实现如图2.2的操作。
(a)为倒置前,(b)为倒置后。
(b)
【解答】:
依次取原链表中的每个结点,将其作为第一个结点插入到新链表中去,指针p用来指向当前结点,p为空时结束。
算法如下:
voidreverse(LinklistH)
{LNode*p;
p=H->next;/*p指向第一个数据结点*/
H->next=NULL;/*将原链表置为空表H*/
while(p)
{q=p;p=p->next;
q->next=H->next;/*将当前结点插到头结点的后面*/
H->next=q;
}
}
算法2.2
该算法只是对链表中顺序扫描一边即完成了倒置,所以时间性能为O(n)。
(3)、已知单链表L,写一算法,删除其重复结点,即实现如图2.3的操作。
(a)为删除前,(b)为删除后。
【解答】:
用指针p指向第一个数据结点,从它的后继结点开始到表的结束,找与其值相同的结点并删除之;p指向下一个;依此类推,p指向最后结点时算法结束。
(b)
算法如下:
voidpur_LinkList(LinkListH)
{LNode*p,*q,*r;
p=H->next;/*p指向第一个结点*/
if(p==NULL)return;
while(p->next)
{q=p;
while(q->next)/*从*p的后继开始找重复结点*/
{if(q->next->data==p->data)
{r=q->next;/*找到重复结点,用r指向,删除*r*/
q->next=r->next;
free(r);
}/*if*/
elseq=q->next;
}/*while(q->next)*/
p=p->next;/*p指向下一个,继续*/
}/*while(p->next)*/
}
算法2.3
该算法的时间性能为O(n2)。
(4)、设有两个单链表A、B,其中元素递增有序,编写算法将A、B归并成一个按元素值递减(允许有相同值)有序的链表C,要求用A、B中的原结点形成,不能重新申请结点。
算法思路:
利用A、B两表有序的特点,依次进行比较,将当前值较小者摘下,插入到C表的头部,得到的C表则为递减有序的。
【解答】:
LinkListmerge(LinkListA,LinkListB)
/*设A、B均为带头结点的单链表*/
{LinkListC;LNode*p,*q;
p=A->next;q=B->next;
C=A;/*C表的头结点*/
C->next=NULL;
free(B);
while(p&&q)
{if(p->datadata)
{s=p;p=p->next;}
else
{s=q;q=q->next;}/*从原AB表上摘下较小者*/
s->next=C->next;/*插入到C表的头部*/
C->next=s;
}/*while*/
if(p==NULL)p=q;
while(p)/*将剩余的结点一个个摘下,插入到C表的头部*/
{s=p;p=p->next;
s->next=C->next;
C->next=s;
}
}
算法2.4
该算法的时间性能为O(m+n)。
第三章栈和队列
1、教学内容:
栈:
栈的抽象数据类型;栈的顺序存储表示;栈的链接存储表示
队列:
队列的抽象数据类型;队列的顺序存储表示;队列的链接存储表示;队列的应用举例;
2、教学要求:
熟练掌握:
栈的定义、特性和栈的抽象数据类型,栈的顺序表示、链表表示以及相应操作的实现。
特别注意栈空和栈满的条件
了解:
在表达式计算时栈是如何使用的;
熟练掌握:
队列的定义、特性和队列的抽象数据类型,队列的顺序表示、链表表示以及相应操作的实现。
特别是循环队列中队头与队尾指针的变化情况;
3、习题与解答:
1、铁路进行列车调度时,常把站台设计成栈式结构的站台,如右图所示。
试问:
(1)设有编号为1,2,3,4,5,6的六辆列车,顺序开入栈式结构的站台,则可能的出栈序列有多少种?
(2)若进站的六辆列车顺序如上所述,那么是否能够得到435612,325641,154623和135426的出站序列,如果不能,说明为什么不能;如果能,说明如何得到(即写出"进栈"或"出栈"的序列)。
【解答】
(1)
可能的不同出栈序列有种。
(2)不能得到435612和154623这样的出栈序列。
因为若在4,3,5,6之后再将1,2出栈,则1,2必须一直在栈中,此时1先进栈,2后进栈,2应压在1上面,不可能1先于2出栈。
154623也是这种情况。
出栈序列325641和135426可以得到。
3
5
6
2
2
4
4
4
4
1
1
1
1
1
1
1
1
5
3
4
4
1
2
2
2
2
6
第四章串
1、教学内容:
字符串:
字符串的抽象数据类型;字符串操作的实现;
2、教学要求:
熟练掌握:
字符串的定义及实现
第五章数组和广义表
1、教学内容:
作为抽象数据类型的数组:
数组的定义和初始化;作为抽象数据类型的数组;数组的顺序存储方式;
2、教学要求:
了解:
作为抽象数据类型的数组的定义,数组的按行顺序存储与按列顺序存储;
了解:
稀疏矩阵的定义及其数组实现;
3、习题与解答:
(1)、画出下列广义表的图形表示和它们的存储表示:
(1)D(A(c),B(e),C(a,L(b,c,d)))
(2)J1(J2(J1,a,J3(J1)),J3(J1))
【解答】:
(1)D(A(c),B(e),C(a,L(b,c,d)))
(2)J1(J2(J1,a,J3(J1)),J3(J1))
J1
J2
J3
C
B
A
D
c
b
a
e
L
a
d
c
0J1
2
2
∧
J1
∧
A
0B
∧
B
0A
1e
2
∧
2
0D
D
1c
2
J2
∧
1a
2
0J2
2
0C
2
1a
C
∧
∧
0J3
J3
2
∧
0L
1d
1c
1b
L
第六章树和二叉树
1、教学内容:
树和森林的概念:
树的定义;树的术语;树的抽象数据类型;
二叉树:
二叉树的定义;二叉树的性质;二叉树的抽象数据类型
二叉树的表示:
顺序表示;二叉链表表示
遍历二叉树:
中序遍历;前序遍历;后序遍历;应用二叉树遍历的事例;二叉树的计数
堆:
堆的定义;堆的建立;堆的插入与删除;堆的调整算法
树与森林:
树的存储表示;森林与二叉树的转换;遍历树;遍历森林
哈夫曼树:
路径长度;哈夫曼树;霍夫曼编码
2、教学要求:
了解:
树和森林的概念。
包括树的定义、树的术语、树的抽象数据类型
掌握:
二叉树的概念、性质及二叉树的表示
熟练掌握:
二叉树的遍历方法
掌握:
树与森林的实现,重点在用二叉树实现
掌握:
森林与二叉树的转换;树的遍历算法
掌握:
二叉树的计数方法及从二叉树遍历结果得到二叉树的方法
掌握:
哈夫曼树的实现方法、构造哈夫曼编码的方法及带权路径长度的计算
3、习题与解答:
(1)、列出右图所示二叉树的叶结点、分支结点和每个结点的层次。
【解答】
二叉树的叶结点有⑥、⑧、⑨。
分支结点有①、②、③、④、⑤、⑦。
结点①的层次为0;结点②、③的层次为1;结点④、⑤、⑥的层次为2;结点⑦、⑧的层次为3;结点⑨的层次为4。
(2)、使用
(1)顺序表示和
(2)二叉链表表示法,分别画出右图所示二叉树的存储表示。
【解答】
0123456789
①
①②③④⑤⑥⑦
∧
③
②
101112131415161718
∧
⑤
∧
⑥
∧
∧
④
⑧⑨
∧
∧
∧
⑧
⑦
顺序表示
二叉链表表示
∧
∧
⑨
(3)、在结点个数为n(n>1)的各棵树中,高度最小的树的高度是多少?
它有多少个叶结点?
多少个分支结点?
高度最大的树的高度是多少?
它有多少个叶结点?
多少个分支结点?
【解答】
结点个数为n时,高度最小的树的高度为1,有2层;它有n-1个叶结点,1个分支结点;高度最大的树的高度为n-1,有n层;它有1个叶结点,n-1个分支结点。
(4)、试分别画出具有3个结点的树和3个结点的二叉树的所有不同形态。
【解答】
具有3个结点的树具有3个结点的二叉树
(5)、请画出右图所示的树所对应的二叉树。
1
【解答】
1
2
2
5
4
4
3
3
对应二叉树
5
7
6
6
8
8
7
(6)、已知一棵二叉树的前序遍历的结果是ABECDFGHIJ,中序遍历的结果是EBCDAFHIGJ,试画出这棵二叉树。
【解答】
当前序序列为ABECDFGHIJ,中序序列为EBCDAFHIGJ时,逐步形成二叉树的过程如下图所示:
A
A
A
A
F
B
B
F
F
B
G
E
C
G
E
C
HIGJ
CD
E
FHIGJ
H
D
J
HI
J
D
I
EBCD
(7)、给定权值集合{15,03,14,02,06,09,16,17},构造相应的霍夫曼树,并计算它的带权外部路径长度。
【解答】
(Ⅰ)
05
17
16
09
06
14
15
F:
17
16
09
06
02
14
15
02
03
03
(Ⅱ)
17
16
09
14
15
20
16
14
15
(Ⅲ)
17
11
09
11
06
05
02
03
06
05
(Ⅴ)
33
20
29
02
03
29
16
17
20
(Ⅳ)
16
17
11
09
15
14
14
11
09
15
05
06
06
05
02
03
02
03
82
(Ⅶ)
49
33
(Ⅵ)
49
33
17
29
20
16
17
16
29
20
14
11
09
15
11
09
15
14
06
05
06
05
03
02
03
02
此树的带权路径长度WPL=229。
(8)、假定用于通信的电文仅由8个字母c1,c2,c3,c4,c5,c6,c7,c8组成,各字母在电文中出现的频率分别为5,25,3,6,10,11,36,4。
试为这8个字母设计不等长Huffman编码,并给出该电文的总码数。
【解答】已知字母集{c1,c2,c3,c4,c5,c6,c7,c8},频率{5,25,3,6,10,11,36,4},则Huffman编码为
c1
c2
c3
c4
c5
c6
c7
c8
0110
10
0000
0111
001
010
11
0001
电文总码数为4*5+2*25+4*3+4*6+3*10+3*11+2*36+4*4=257
1
0
100
1
39
61
1
0
0
1
1
0
0
C2
17
22
36
25
C7
7
11
11
10
1
1
0
0
C6
C5
5
6
3
4
C4
C1
C8
C3
第七章图
1、教学内容:
图的基本概念:
图的基本概念;图的抽象数据类型
图的存储表示:
邻接矩阵;邻接表;邻接多重表
图的遍历与连通性:
深度优先搜索;广度优先搜索;连通分量;关节点与重连通分量
最小生成