数据结构教案.docx
《数据结构教案.docx》由会员分享,可在线阅读,更多相关《数据结构教案.docx(123页珍藏版)》请在冰豆网上搜索。
数据结构教案数据结构教案吉林大学珠海学院教案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)