数据结构教案.docx

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

数据结构教案.docx

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

数据结构教案.docx

数据结构教案数据结构教案吉林大学珠海学院教案20112012学年第2学期系(中心)计算机科学与技术系教研室课程名称数据结构主讲教师陈守孔、冯广慧吉林大学珠海学院教务处制教案讲授章节第1讲绪论授课时数2教学目的:

1.了解数据结构课程的重要性和课程的基本要求,以及本课程涵盖的内容;2.掌握数据结构的基本概念;3.理解算法描述和简单的算法分析。

教学内容(讲授提纲)1.从后序课(数据库、操作系统、编译原理、人工智能)的需要和考研两方面介绍数据结构课程的重要性。

2.通过三个例子讲解数据结构研究的内容。

3.介绍基本概念:

数据的三个层次,数据结构的三个要素,数据结构的分类,四种存储结构,抽象数据类型,算法,算法的五个特性,对算法设计的要求,算法描述和算法分析,时间复杂度和空间复杂度。

4.从“百钱买百鸡”(“一百元钱买一百支笔”)的算法例子说明选择算法的重要性:

方案1:

for(i=0;i=100;i+)for(j=0;j=100;j+)for(k=0;k=100;k+)if(i+j+k=100&3*i+2*j+0.5*k=100)printf(“i=%d,j=%d,k=%d”,i,j,k)方案2:

for(i=0;i=20;i+)for(j=0;j=34-i;j+)if(3*i+2*j+(100-i-j)*0.5=100)printf(“i=%d,j=%d,k=%d”,i,j,100-i-j);方案1内层循环超过100万次,在某机器上运行了50分钟;方案2的if语句执行525次,运行了2秒钟,相差1500倍。

5.算法分析举例

(1)常量阶:

时间复杂度为O

(1)+x;s=0;语句频度为1,时间复杂度为O

(1)。

for(j=1;j=10000;+j)+x;s+=x;语句频度为10000,时间复杂度为O

(1)。

(2)对数阶:

时间复杂度为O(logn)s=0;for(j=1;j=n;j*=2)s+;语句频度为logn,所以时间复杂度为O(logn)。

(3)线性阶:

时间复杂度为O(logn)S=0;for(j=1;j=n;+j)s+;语句频度为n,所以时间复杂度为O(n)。

(4)时间复杂度为O(nlogn)s=0;for(j=1;j=n;j*=2)for(k=1;k=n;+k)s+;时间复杂度为O(nlogn)(5)平方阶:

时间复杂度为O(logn)s=0;for(j=1;j=n;+j)for(k=1;k=n;+k)s+;语句频度为n2,所以时间复杂度为O(n2)。

s=0;for(j=1;j=n;j+)for(k=1;k=j;+k)s+;语句频度为n(n+1)/2,所以时间复杂度仍为O(n2)。

(6)立方阶:

时间复杂度为O(n3)例:

矩阵乘法:

nxnfor(i=0;in;i+)/(n+1)for(j=0;jn;j+)/n(n+1)cij=0;/n2for(k=0;k1)个整数存放到一维数组R中。

试设计一个在时间和空间两方面都尽可能高效的算法,将R中保存的序列循环左移P(0Pn)个位置,即将R中的数据由(X0,X1,Xn-1)变换为(Xp,Xp+1,Xn-1,X0,X1,Xp-1)。

要求:

(1)给出算法的基本设计思想。

(2)根据设计思想,采用C或C+或JAVA语言描述算法,关键之处给出注释。

(3)说明你所设计算法的时间复杂度和空间复杂度。

解答:

(1)算法设计思想:

按照下标0到p-1、p到n-1、0到n-1的顺序,将这三段分别逆置,最后的结果即为所求。

(2)voidleftshift(intR,intp,intn)/将有n个元素的一维数组R的序列循环左移p(0pn)个位置elemtypet;/t和数组R中的元素具有相同类型for(i=0;ip/2;i+)/逆置0.p-1段t=Ri;Ri=Rp-1-i;Rp-1-i=t;for(i=p;i(n+p)/2;i+)/逆置p.n-1段t=Ri;Ri=Rn-1-i+p;Rn-1-i+p=t;for(i=0;inext=NULL;/初始化一个空链表,L为头指针scanf(&x);/x是和链表元素具有相同类型的变量while(x!

=flag)/flag为结束输入的标志p=(LNode*)malloc(sizeof(LNode);p-data=x;/输入元素值p-next=L-next;/链接到表中L-next=p;/插入到表头scanf(&x);/读入下一个元素的值returnL;

(2)尾插法LinkedListLinkedListCreat2()/用尾插法建立带头结点的单链表LinkedListL;L=(LNode*)malloc(sizeof(LNode);L-next=NULL;r=L;scanf(&x);while(x!

=flag)/设置结束标志p=(LNode*)malloc(sizeof(LNode);p-data=x;/赋值元素值r-next=p;/在尾部插入新结点r=p;/r指向新的尾结点scanf(&x);r-next=NULL;/最后结点的指针域放空指针returnL;(3)单链表的遍历voidprint(LinkedListla)/非递归LinkedListp=la-next;while(p)printf(“%c,”,p-data);/正序输出p=p-next;voidout(LinkedListp)/递归if(p)out(p-next);printf(“%c,”,p-data);/逆序输出/若将以上两个语句位置调换,则正序输出5.了解单链表的应用。

举例1.:

LinkedListUnion(LinkedListla,LinkedListlb)将非递减有序的单链表la和lb合并成新的非递减有序单链表lc,并要求利用原表空间举例2:

已知一个带有表头结点的单链表,结点结构为(data,link),假设该链表只给出了头指针list。

在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数),若查找成功,算法输出该结点的data域的值,并返回1;否则,只返回0,要求:

描述算法的基本设计思想;描述算法的详细实现步骤;根据设计思想和实现步骤,采用程序设计语言描述算法(使用C或C+或JAVA语言实现),关键之处请给出简要注释。

【2009年全国硕士研究生入学计算机学科专业基础综合试题】intSearchInvK(LinkedListla,intk)/在单链表la上查找倒数第k个结点p=list-link;/p指向当前待处理元素q=list;/若成功,q指向倒数第k个元素i=1;while(p&ilink;if(p=null)printf(“不存在n”);return0;while(p)q=q-link;p=p-link;return1;/end本章节的教学重点、难点:

1动态存储(单链表)的概念。

2单链表的算法设计。

教学方法、教学手段:

1链表的定义和基本操作的实现(45分钟)2链表生成和链表应用的算法设计(45分钟)使用教具:

计算机和投影仪作业、讨论题、思考题:

2.1试述头指针、头结点、元素结点、首元结点的区别,说明头指针和头结点的作用。

2.2分析顺序存储结构和链式存储结构的优缺点,说明何时应该利用何种结构。

2.4为什么在单循环链表中常使用尾指针,若只设头指针,插入元素的时间复杂度如何?

2.5在单链表、双链表、单循环链表中,若知道指针p指向某结点,能否删除该结点,时间复杂度如何?

2.6下面算法的功能是什么?

LinkedListUnknown(LinkedListla)LNode*q,*p;if(la&la-next)q=la;la=la-next;p=la;while(p-next)p=p-next;p-next=q;q-next=null;returnla;2.7选择题:

在循环双链表的*p结点之后插入*s结点的操作是()A、p-next=s;s-prior=p;p-next-prior=s;s-next=p-next;B、p-next=s;p-next-prior=s;s-prior=p;s-next=p-next;C、s-prior=p;s-next=p-next;p-next:

=s;p-next-prior=s;D、s-prior=p;snext=pnext;pnext-prior=s;p-next=s;原:

2.9设ha和hb分别是两个带头结点的非递减有序单链表的头指针,试设计算法,将这两个有序链表合并成一个非递增有序的单链表。

要求使用原链表空间,表中无重复数据。

改:

2.9设ha和hb分别是两个带头结点的非递减有序单链表的头指针,试设计算法,将这两个有序链表合并成一个非递减有序的单链表。

要求使用原链表空间,表中无重复数据。

参考资料:

1陈守孔等著算法与数据结构C语言版机械工业出版社20072陈守孔等著算法与数据结构考研试题精析机械工业出版社20083严蔚敏等著数据结构C语言版清华大学出版社20054D.E.Knuth著计算机程序设计技巧第一、三卷管纪文译国防出版社教案讲授章节第4讲循环链表双链表授课时数2教学目的:

1.掌握循环链表引入的背景:

从任一结点开始可以访问链表中的全部结点。

2.掌握循环链表(单循环链表,双循环链表)和双链表。

教学内容(讲授提纲)1比较顺序表和单链表操作的优缺点,使用范围。

2介绍单循环链表。

指出:

单循环链表往往只设尾指针。

3.讲解两个只设尾指针的单循环链表合并成一个单循环链表的例子。

4双链表的定义:

typedefstructDLNodeElemTypedata;structDLNode*prior,*next;DLNode,*DLinkedList;5.双链表和双循环链表是两种链表。

6.线性表的操作在双链表中的实现凡涉及一个方向的指针时,如求长度,取元素,元素定位等,其算法描述和单链表基本相同。

但是在插入或删除结点时,一个结点就要修改两个指针域,所以要比单链表复杂。

由于双链表有两个指针域,求前驱和后继都很方便。

6.算法设计举例:

(1)将单循环链表改为双循环链表假设一个单循环链表,其结点含有三个域pre、data、next。

其中data为数据域;pre为指针域,它的值为空指针(null);next为指针域,它指向后继结点。

请设计算法,将此表改成双向循环链表。

voidSToDouble(LinkedListla)while(la-next-pre=null)la-next-pre=la;/将结点la后继的pre指针指向lala=la-next;/la指针后移/算法结束

(2)已知一双向循环链表,从第二个结点至表尾递增有序,(设a1xnext;将第一结点从链表上摘下p-prior=L-prior;p-prior-next=p;while(p-datanext;查插入位置s-next=p;插入原第一结点ss-prior=p-prior;p-prior-next=s;p-prior=s;算法结束(3)链表的匹配逆置L1与L2分别为两单链表头结点地址指针,且两表中数据结点的数据域均为一个字母。

设计把L1中与L2中数据相同的连续结点顺序完全倒置的算法。

LinkedListPatternInvert(LinkedListL1,LinkedListL2)p=L1;p是每趟匹配时L1中的起始结点前驱的指针q=L1-next;q是L1中的工作指针。

s=L2-next;s是L2中的工作指针。

while(p!

=null&s!

=null)

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

当前位置:首页 > 法律文书 > 调解书

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

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