我究竟该用什么语言来实现数据结构严蔚敏pdf下载的学习

怎样学习数据结构_百度知道
怎样学习数据结构
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
来自知道合伙人认证行家
健身类行家
采纳数:145431
获赞数:630705
很多计算机专业的同学对于大学2年级开设的数据结构课程很是头痛. 看见大家总在谈论数据结构重要性,可使自己学习却总也找不到合适的方法. 下面我和大家分享一下我过去一年多以来学习和应用数据结构方面一些经验. 内容都是来自作者本人的一些经历和体验,希望对于大家学习数据结构有引导作用。 1 什么是数据结构 数据结构从文字上面来看,为数据和结构两部分。这样就很容易联系到数据结构的本质是一种对于数据结构花的知识。补充一个知识点,数据结构本质和离散数学有很密切的关系。离散数学是处理的是离散(非连续的)的数据,站在数据结构的观点上来看,也可以理解是一种非连续数据的结构。2 数据结构和程序设计语言 数据结构和程序设计语言本身没有任何联系,唯一有的关系就实用程序语言去描述数据结构。 因为数据结构是一种抽象数据,通过程序设计语言可以将在计算机中进行实现。今天大学里数据结构课程常用来描述数据结构的语言有C程序设计语言,C++程序设计语言和JAVA程序设计语言. 而对于喜欢其他语言的同学完全可以自己通过学习数据结构后用自己熟悉的程序设计语言去完成程序化的描述.我自己过去很喜欢C#程序设计语言,自己用C#程序设计对于一些数据结构进行了实现. 大家可以通过访问CSTC我的专栏看到两篇C#描述的数据结构 3 数据结构学习的技巧 3.1 学习数据结构的概念后对于抽象数据类型的设计参考C++ STL标准库中容器的设计.这样对于无论是数据结构的学习还有程序设计接口能力上都会有很大的提高. 3.2 对于数据结构课程中很多时候都不太重视的顺序(数组)做存储的数据结构,希望大家还是要多留意这快的知识.对于有些场合需要考虑时间换空间的情况下需要考虑顺序存储结构.3.3数据结构学习一定要自己独立完成代码实现,虽然有时候你理解内容了,但是实现上面还是会愈要很多困难的,解决这些困难会帮助你提高程序设计的能力的.
花姑娘的乐园
花姑娘的乐园
获赞数:20
擅长:暂未定制
数据结构是为算法服务的,而且都是一些经典算法,所以数据结构相对比较固定要是研究算法会更难,所以先简单看看算法,回过头来再看数据结构就简单了
为你推荐:
其他类似问题
您可能关注的内容
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。数据结构学习心得
山不在高,有仙则灵;水不在深,有龙则灵;要学好数据结构,有数据结构学习网才行!
首先,恭喜您发现了这个网站:一个神奇的学习数据结构的网站!
其次,感谢您打开这个网页阅读这篇文章,实在太感谢啦!
再次,正在激动中......哽咽了。还是让我先来介绍一下我自己吧:
我就是江湖上人见人爱、花见花开、车见车载,人称上天入地、无所不能、英俊潇洒、风流倜傥、玉树临风、学富五车、高大威猛、拥有千万粉丝、迷倒万千少女,号称一朵梨花压海棠的玉面小黄驴,帅到掉渣!一个见过我的女孩儿曾对我说:“如果世界只剩下十分钟的话,我会和你一同回忆你帅时的样子;如果世界只剩下三分钟的话,你要再摆一下你最最最帅的造型给我看;如果世界只剩下一分钟的话,我会对你对你说60次—小黄驴,你真帅!”还有一个女孩儿每天早晨都站在教室门口,痴痴地望着我,呆呆状喃道:“世间本无沙漠,只是我每看到一次你帅的样子,天上便会落下一粒沙,从此便有了撒哈拉。”唯心主义说:“我说你帅,你就是帅。”唯物主义说:“因为你帅,所以我说你帅。”总而言之一句话—我,就是帅。一个不帅驴子的标志是他愿意为自己的不帅英勇地死去,一个帅气驴子的标志是他愿意为自己的帅而卑怆地活着,所以,至今我还为自己的帅坚强的活着。
本人没什么优点,唯一的优点就是没有缺点;本人基本全是缺点,最大的缺点就是只有优点;如果靓仔是一种罪,我已经罪犯滔天;如果有型是一种错,我已经一错再错;如果聪明要受惩罚,我岂不是要千刀万剐;如果谦虚都要受折磨,我又怎能逃得过?
吹了这么半天驴掰,相信大家一定已经对我有好感了,下面该说点严肃的事情了:
天将降大任于斯人也:据说,我出生时,天空的北方,出现祥云一片,渐渐由远至近,飘到我家房顶后,幻化成几个大字:“”。在接下来的若干年中,我一直在驴不停蹄地努力打造这个人类历史上、整个宇宙中最经典、最驴掰的可供大家免费学习数据结构的网站,这个网站的出现,是顺应天意的结果,更是历史的必然!
那么,上天为什么委托我建造这个前无古人后无来者、举世无双、屌爆了的网站呢?学习数据结构到底有啥用?数据结构到底该咋学?
数据结构是计算机科学与技术专业、计算机信息管理与应用专业,电子商务等专业的基础课,是十分重要的核心课程。所有的计算机系统软件和应用软件都要用到各种类型的数据结构。因此,要想更好地运用计算机来解决实际问题,仅掌握几种计算机程序设计语言是难以应付当前众多复杂的课题。要想有效地使用计算机、充分发挥计算机的性能,还必须学习和掌握好数据结构的有关知识。打好“数据结构”这门课程的扎实基础,对于学习其他专业课程是十分有益的。
对于怎么能学好这门课程,我个人觉得基本上就是上课前看看书、上课时认真听课、下课以后复习复习、当然还有做作业时很认真的去做。根本谈不上什么好方法,不过我还是有一些话要送给大家:
一、打好基本功
不管学习什么,概念是基础,所有的知识框架都是建立在基础概念之上的。所以,第一遍看课本要将概念熟记于心,然后构建知识框架。比如看了一遍书后你至少应该知道数据结构包括线性结构、树形结构、图状结构或网状结构。线性结构包括线性表、栈、队列、串、数组、广义表等,栈和队列是操作受限的线性表,串的数据对象约束为字符集,数组和广义表是对线性表的扩展:表中的数据元素本身也是一个数据结构。除了线性表以外,栈是重点,因为栈和递归紧密相连,递归是程序设计中很重要的一种工具。树状结构中的重点自然是二叉树和哈弗曼树了。对于二叉树的很多操作都是基于对二叉树的遍历,掌握了如何遍历,很多问题也就迎刃而解了,比如对二叉树结点的查找访问、统计二叉树中叶子结点的数目、求二叉树的深度等。哈弗曼编码也有着很广泛的应用。对于图状结构,主要学习图的存储结构及图的遍历。
二、不能看不起自己
“我能行!”
个人觉得这句话非常重要,不知道大家是怎样看待数据结构这门课的,有多少人觉得数据结构很难呢?我知道还是有一些同学这样觉得的,有时候我跟我的朋友讲要怎样学,讲了一大堆以后,他就向我抱怨:我以前c++都没有学好,数据结构更学不好了,这哪跟哪的话啊,数据结构与c++没有什么关系,我想假如抱有这样的心态,自己就不相信自己,那是不可能学好的,那些觉得数据结构很难的同学,我想他们应该会很看重数据结构的吧,然后他们就一天到晚捧着一本数据结构,这样不会觉得很累吗?而且因为觉得很难,就容易不相信自己,学的效率也不会很好,或许这有点太妄自菲薄了吧。个人认为数据结构很好学,很容易学,因为我觉得很容易,当然就会觉得自己没问题,学得很轻松,效果也还可以。大家都是从高考走过来的,应该知道心态的重要性吧,两种不同的心态,完全就是两种不同的效果。学习数据结构我们到底要学些什么呢?不知道大家有没有想过,那现在我们现在来归纳一下我们学习的内容吧,其实我们也就学了几种普通的数据结构,像二叉树,树,图还有排序的问题,前面的线性表和字符串也就是一些概念,当然还有一个很重要的KMP算法,然后在每种数据结构中我们也就是学到了若干处理的算法,我想真正数起来也就是几十个算法吧。学习数据结构也就是要掌握这几十种算法,多简单!至于如何掌握每个算法呢,我想就是多看看书,重要的是能够理解。个人认为,学习的难易程度很大程度上决定于个人的兴趣。把一件事情当做任务去做会很痛苦,当做兴趣去做会很快乐。如果想让自己在学习数据结构的过程中更轻松一些,就应该先培养对这门学科的兴趣。
三、坚持独自完成作业的好习惯
有一些同学总是喜欢先问好别人算法,然后再自己写,虽然这个不算抄袭作业,但自己基本上没有一个思考问题的过程,虽然要理解算法也会要思考很多,但是因为没有自己独立的思考过程,要自己写程序、写算法的时候根本写不出来,所以我想如果真的想学好数据结构的话,最好是能够自己思考问题,不要刚想了一会就觉得做不出来,然后就去问其他人。其实老师给我们的作业大多数还是基于我们的水平的,我绝对相信我们自己能够独自想出算法,虽有可能会比较长时间吧,但是这样肯定会比问其他人学到更多的东西。当然我并不是说不要问同学,有时候就是脑筋转不过来,一问别人就懂了,当然问了别人不能只是我知道了这个算法,还应该去想如何思考才能得到这个算法,这样水平会提高很多。
对算法的学习是学习数据结构的关键。在看课本的过程中,要注重对算法的掌握。对于一个算法,读一遍可能能读懂,但不可能完全领会其中的思想。掌握一个算法,并不是说将算法背过,而是掌握算法的思想。我们需要的是耐心。每看一遍就会有这一遍的收获。读懂算法之后,自己再默写算法,写到不会的地方,看看课本想想自己为什么没有想到。反复练习,直到能顺利写出算法为止。个人认为,这是行之有效的方法。这样,不仅可以更加深入的领会算法思想,还会逐渐发现算法的巧妙之处,从而对数据结构产生兴趣。
四、多动手实验
这个就没有太多理由了,我一直觉得编程是一门熟练科学,多编程,水平肯定会提高,最重要的是能够养成一种感觉,就是对程序对算法的敏感,为什么那些牛人看一个算法一下子就看懂了?而自己要看很久才能弄懂,而且弄懂了过了一阵子又忘记了?其实这个是因为牛人们以前看的程序很多,编得也很多,所以他们有了那种感觉,所以我觉得大家应该多看程序,多写程序,培养自己的感觉。数据结构是实践很强的一门课程,光是“听”和“读”是绝对不够的,必须加强实践。在写算法的过程中,可能会出现很多问题,而不断修改的过程便是学习的过程。在这个过程中,只要全身心的投入了,便会发现很多乐趣。
五、关于复习和考试的一些技巧
我想大家应该都有这样的感觉,就是觉得自己什么都掌握了,但是在考试的时候就是会犯晕,有时候一出考场就知道错在哪个了,然后考完以后一对答案,发现其实考得很简单,应该都是自己会做的,这个就是与自己的复习和考试的技巧有关系了。
首先就是复习,前面已经说过其实我们学的算法也就是几十个,那么我们的任务也就是理解这几十个算法,复习也就是要加深你的理解。如何理解算法,然后理解到什么程度呢?是能默写出整个算法吗?其实不是这样的,数据结构的考试有它的特点,考过期末考试了,大家应该都发现数据结构其实不要求你把整个算法背出来,它注重考察你的理解,那么怎么考察呢?其实也就是两种方式吧,一种就是用实例,就是给你一个例子,要你用某个算法运行出结果,我想这个期末考试的时候仍然会有很多这样的题目,比如排序那块就很好出这样的题目,要复习这种题目我觉得很简单,就是每个算法都自己用例子去实践一下,以不变应万变,我当年期末复习的时候就是这样去做的,而且考试之前我就觉得排序类的题目就很有可能会考,于是就自己编写各类排序算法运行了一遍。另外一种考察方式就是算法填空和算法改错,可能有一些同学觉得这种题目很难,其实我们首先可以确定这两种题目肯定是与书上算法有关系的,只要理解了书上的算法就可以了,有人觉得看完书以后什么都懂了,而且要默写也默写得出来,其实不是这样的,算法改错和填空主要是考察的细微处,虽然你觉得你默写得出来,那是能够默写出算法的主体部分,很多细微的地方你就会很容易忽略。我想大家考过期末考以后应该都有这种感觉吧?那要怎样解决这种问题呢?我觉得有两种方法,一种就是自己去编程实现,这种方法比较有意义,还能够提高编程水平,另外一种就是用实例分析算法的每句话,我认为这种方法是最有效的。
然后还有一种题目,就是最后的写算法的题目,我觉得这种题目还是很好解决的,只要是能够自己做出作业的,基本上都会很容易做出来,这也是为什么我前面觉得平时做作业应该自己独立思考的原因,同时做这种题目千万要小心,尤其是题目简单的时候,那肯定会有一些小地方要考虑清楚,一不小心就会被扣掉很多分,这样很不值。
我觉得考试的时候没有太多要讲的,只要复习好了,考试的时候细心一点就可以了,然后就是做一个题目开始就要尽量保证正确,如果觉得留在那里等后面做完了再来检查,这样错误还是很有可能检查不出来,我期末考试的时候就基本上没有检查,因为我做每个题目都是确保正确,用的时间也挺多的,然后也觉得没有检查的必要了。
五百年回眸才换来今生的擦肩而过,一万年方得今日在此相聚,我希望大家能记住我的名字—小黄驴,因为我将会和大家成为最好的朋友。我希望大家能记住我的网站—数据结构学习网,因为她将会成为一个让大家可以依赖的学习港湾。我们将风雨无阻一起走过一段美好的时光,祝大家学习愉快!学有所得!
(版权声明:本文出自,文中的观点仅代表原作者个人意见,著作权归原作者所有)
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
揭秘黄家驹死亡真相,介绍黄家驹的生前事迹,作品等
学习数据结构的网站,分享史上最全的数据结构视频教程、电子书、试卷及习题解析
今日搜狐热点00:18 提问
学习数据结构之前需要先学C语言么?数据结构和算法有什么关系?
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
按赞数排序
想学哪种语言,就去学(看书)跟哪种语言有关的数据结构(书籍)
数据结构跟语言,本质上没有关系
汇编语言。一样可以有数据结构
不过,用某种语言(如C++)表达数据结构,更好理解,更好编程序
个人认为通过C++学数据结构比较好,兼顾类与指针。有时数据结构好比积木,算法就像搭建好的房子,有时数据结构依赖算法,感觉相互交叉的。
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐C语言没有学好,怎么学数据结构??_百度知道
C语言没有学好,怎么学数据结构??
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
采纳数:1497
获赞数:19082
数据结构和C语言本身无关。1、数据结构很重要,在学习计算机类相关知识中占有很大成分,它注重的是思想,想法。数据结构所讲的就是一些算法,核心算法,讲解那些问题的解决核心算法,学习数据结构主要帮助你去更好的锻炼你的思考能力,看到一个编程题,如何去想,如何去构思,怎样才能解决。考研过程中数据结构也是一个重要的考察对象。2、总之,它很重要,建议学好链表和线性表那一章,那是整个数据结构的基础之基础,后面的学习基本上都是在那上面展开的。在学习过程中,要多想,多思考,多看书,要用心去体悟书本的那些算法,去理解那些核心思想,去把握,去学习,去掌握。学习久了,就会有感觉的,边学边练习也是不错的做法,相信会学好的。
落花不是流水意
落花不是流水意
获赞数:31
数据结构研究的是如何存储、操作数据,楼主应该关心每种数据结构的数学模型,可以用在什么场合,各种性能怎么样:例如增加数据,查找数据,删除数据都要花多少时间与内存。至于C语言只是一种表现工具,有C语言版的数据结构也有C++的数据结构等等,数据结构是方法,C、C++等是操作对象,如果要学号数据结构,起码C语言里的最基本的代码要能看懂的吧。还有就是学数据结构时要经常用到C语言编程来实践熟练数据结构的思想方法。。。额,我就是说说它们两个的关系,总之我们学数据结构就是为了编程,就算你把数据结构学的再好,学不好编程,没有地方去用也是白搭。所以还是再补补C语言吧,多看看教材,小程序每天写一两个,我大一就是这样过的。
本回答被提问者采纳
采纳数:73
获赞数:215
数据结构和C语言差不多的。里面有些内容和C也差不多还是先安心的学好C语言的语法和编写程序的想法,数据结构说白了还是C语言
super_admi
来自电脑网络类芝麻团
super_admi
采纳数:404
获赞数:978
参与团队:
数据结构,说白了,是一种思想。你可以用C语言描述,也可以用其它语言来描述,比如,汉语。
是不是只有学好了c语言,才学的好数据结构??
获赞数:20
建议你还是先学好C语言,因为它毕竟是基础,基础没打牢,数据结构你是很难学好的!
其他2条回答
为你推荐:
其他类似问题
您可能关注的内容
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。当前位置: >>
《数据结构》(c语言版)测试题答案
①第一章概论题号 题分 得分 一 33自测题答案二 15 三 9姓名四 8 五 20班级六 15 总分 100一、填空题(每空 1 分,共 33 分) 填空题(1. 一个计算机系统包括硬件系统和软件系统两大部分。 两大部分。软件资源 /(系统) (系统)2. 一台计算机中全部程序的集合,称为这台计算机的 一台计算机中全部程序的集合, 3. 计算机软件可以分为 于系统软件(工具) 系统软件(工具) 系统。 ,诊断程序属软件和应用软件两大类。 软件两大类。科学计算程序包属于 应用软件。汇编语言4. 一种用助忆符号来表示机器指令的操作符和操作数的语言是。 以及它们之间的关系5. 数据结构是一门研究非数值计算的程序设计问题中计算机的 操作对象 学科。 学科。 6. 数据结构被形式地定义为(D, R) 其中 D 是 数据结构被形式地定义为( ,其中 ) , 7. 数据结构包括数据的 逻辑结构数据元素和运算等的的有限集合, 的有限集合,R 是 D 上的运算关系有限集合。 有限集合。、数据的 存储结构和数据的 和数据的 和这三个方面的内容。 这三个方面的内容。 。8. 数据结构按逻辑结构可分为两大类,它们分别是 数据结构按逻辑结构可分为两大类,线性结构非线性结构9. 线性结构中元素之间存在一对一关系, 线性结构中元素之间存在一对一关系, 一对一关系 树形结构中元素之间存在一对多关系, 树形结构中元素之间存在一对多关系, 一对多关系 图形结构中元素之间存在多对多关系。 图形结构中元素之间存在多对多关系。 多对多关系 10. 在线性结构中, . 在线性结构中, 前驱结点, 个前驱结点; 第一个结点 没有 前驱结点, 其余每个结点有且只有 1 个前驱结点; 最后一个结点 没有 续结点, 个后续结点。 续结点,其余每个结点有且只有 1 个后续结点。 11. 在树形结构中,树根结点没有 前驱 结点,其余每个结点有且只有 在树形结构中, 结点, 结点,其余每个结点的后续结点数可以任意多个 。 结点,其余每个结点的后续结点数可以任意多个 12. 在图形结构中,每个结点的前驱结点数和后续结点数可以 任意多个 在图形结构中, 1 个前驱结点; 个前驱结点;叶子结点没有 后续 后。13.数据的存储结构可用四种基本的存储方法表示,它们分别是顺序 、 链式 、 索引 和 散列 。 数据的存储结构可用四种基本的存储方法表示, 数据的存储结构可用四种基本的存储方法表示 14. 数据的运算最常用的有 5 种,它们分别是插入 、 删除、修改、 查找 、排序。 删除、修改、 15. 一个算法的效率可分为 时间 效率和空间效率。 效率。 和若干个被调用的其它函数组成。 和若干个被调用的其它函数组成。 被调用的其它函数组成确定变量所允许的运算16. 〖00 年省统考〗任何一个 C 程序都由 年省统考〗一个主函数17. 【00 年省统考题】变量一经说明,就确定该变量的取值范围(即存储单元)及 年省统考题】变量一经说明, 即存储单元)。二、单项选择题(每小题 1 分,共 15 分) 单项选择题(① ②(B ) 1. 通常所说的主机是指∶ 通常所说的主机是指∶ A) CPU B) CPU 和内存 CC) CPU、内存与外存 、D) CPU、内存与硬盘 、(在计算机内部,一切信息的存取、处理和传送的形式是∶ )2. 在计算机内部,一切信息的存取、处理和传送的形式是∶ A) ACSII 码 B) BCD 码 C)二进制 D)十六进制 二进制 十六进制 软件与程序的区别是∶ )3. 软件与程序的区别是∶ A) 程序价格便宜、软件价格昂贵; 程序价格便宜、软件价格昂贵; B) 程序是用户自己编写的,而软件是由厂家提供的; 程序是用户自己编写的,而软件是由厂家提供的; C) 程序是用高级语言编写的,而软件是由机器语言编写的; 程序是用高级语言编写的,而软件是由机器语言编写的; D) 软件是程序以及开发、使用和维护所需要的所有文档的总称,而程序只是软件的一部分。 软件是程序以及开发、使用和维护所需要的所有文档的总称,而程序只是软件的一部分。 所谓“裸机”是指∶ )4. 所谓“裸机”是指∶ A) 单片机 B)单板机 单板机(D(CC) 不装备任何软件的计算机D) 只装备操作系统的计算机(D应用软件是指∶ )5. 应用软件是指∶ A)所有能够使用的软件 所有能够使用的软件 C)所有微机上都应使用的基本软件 所有微机上都应使用的基本软件B) 能被各应用单位共同使用的某种软件 D) 专门为某一应用目的而编制的软件年省统考〗 语言中的常量可分为整型常量、实型常量、 枚举) 四种。 ( *A )6. 〖00 年省统考〗C 语言中的常量可分为整型常量、实型常量、字符型常量及 (枚举 四种。 (A) 符号常量 ) (B)长整型常量 ) (C) 逻辑常量 ) (D)二进制整数 )编译程序的功能是∶ ( *C )7. 编译程序的功能是∶ A)发现源程序中的语法错误 发现源程序中的语法错误 C)将源程序编译成目标程序 将源程序编译成目标程序 ( A 系统软件中最重要的是 重要的是∶ )8. 系统软件中最重要的是∶ A) 操作系统 B) 语言处理系统B)改正源程序中的语法错误 改正源程序中的语法错误 D)将某一高级语言程序翻译成另一种高级语言程序 将某一高级语言程序翻译成另一种高级语言程序C) 工具软件D) 数据库管理系统(C )9. 可移植性最好的计算机语言是∶ 可移植性最好的计算机语言是∶ A) 机器语言 B)汇编语言 汇编语言C) 高级语言D) 自然语言非线性结构是数据元素之间存在一种: ( B )10. 非线性结构是数据元素之间存在一种: A)一对多关系 ) B)多对多关系 )C)多对一关系 )D)一对一关系 )数据结构中, ( C )11. 数据结构中,与所使用的计算机无关的是数据的 A) 存储 B) 物理 C) 逻辑 算法分析的目的是: ( C )12. 算法分析的目的是: A) 找出数据结构的合理性 C) 分析算法的效率以求改进 算法分析的两个主要方面是: ( A )13. 算法分析的两个主要方面是: A) 空间复杂性和时间复杂性 C) 可读性和文档性结构; 结构; D) 物理和存储B) 研究算法中的输入和输出的关系 D) 分析算法的易懂性和文档性B) 正确性和简明性 D) 数据复杂性和程序复杂性计算机算法指的是: ( C )14. 计算机算法指的是: A) 计算方法 计算方法 B) 排序方法 C) 解决问题的有限运算序列D) 调度方法② ③计算机算法必须具备输入、 ( B )15. 计算机算法必须具备输入、输出和 A) 可行性、可移植性和可扩充性 可行性、 C) 确定性、有穷性和稳定性 确定性、个特性。 等 5 个特性。 B) 可行性、确定性和有穷性 可行性、 D) 易读性、稳定性和安全性 易读性、三、简答题(每小题 3 分,共 9 分) 简答题(1.我们知道计算机只能执行机器指令,为什么它能运行用汇编语言和高级语言编写的程序? .我们知道计算机只能执行机器指令,为什么它能运行用汇编语言和高级语言编写的程序?答:靠汇编程序将汇编语言或高级语言翻译转换为目标程序(即机器语言) 靠汇编程序将汇编语言或高级语言翻译转换为目标程序(即机器语言) 器语言 。2.【严题集 1.2②】数据结构和数据类型两个概念之间有区别吗? 【 ② 数据结构和数据类型两个概念之间有区别吗?答:简单地说,数据结构定义了一组按某些关系结合在一起的数组元素。数据类型不仅定义了一组带结构的数据元素,而且还在其上定 简单地说,数据结构定义了一组按某些关系结合在一起的数组元素。数据类型不仅定义了一组带结构的数据元素, 义了一组操作。 义了一组操作。3. 简述线性结构与非线性结构的不同点。 简述线性结构与非线性结构的不同点。一对一的,非线性结构反映结点间的逻辑关系是多对多的。 答:线性结构反映结点间的逻辑关系是 一对一的,非线性结构反映结点间的逻辑关系是多对多的。程序段,写出相应的执行结果( 四、 00 年统考题〗阅读下列 C 程序段,写出相应的执行结果(每小题 4 分,共 8 分) 〖 年统考题〗1. printf(“Input x”); scanf(“%d”,&x); if (x&=30) if(x&20) y=x; else if (x&10) y=2*x; if (x&0&&x&30)printf(“x=%d,y=%d”,x,y); else printf(“输入数据错!”); 输入数据错! 输入数据错 试写出当 x 分别为 18,8 时的执行结果。 , 时的执行结果。答:运行结果为:x=18,y=36 运行结果为: , x=8,y=运行前的值, 且从 x=30 开始为数据错 运行前的值, , 运行前的值 =2.long int fact(n) { if(n&1)f=n*fact(n-1); else f=1; return(f); } main() { n=5; y=fact(n); printf(“%d,%ld\n”,n,y); }答:运行结果为: 5,120 运行结果为: ,此题为递归运算③ ④五、 严题集 1.8④】分析下面各程序段的时间复杂度(每小题 5 分,共 20 分) 【 ④ 分析下面各程序段的时间复杂度(1. for (i=0; i&n; i++) for (j=0; j&m; j++) A[i][j]=0; 答:O(m*n) 2. s=0; for i=0; i&n; i++) for(j=0; j&n; j++) s+=B[i][j]; sum=s;答:O(n2) x=0; for(i=1; i&n; i++) for (j=1; j&=n-i; j++) x++; 解:因为 x++共执行了 n-1+n-2+……+1= n(n-1)/2,所以执行时间为 O(n2) ( 3.4.i=1; while(i&=n) i=i*3; 答:O(log3n),试按各小题所给条件画出这些逻辑结构的图示 六、设有数据逻辑结构 S=(D,R) 试按各小题所给条件画出这些逻辑结构的图示,并确定相对于关系 ( ) 试按各小题所给条件画出这些逻辑结构的图示, , R,哪些结点是开始结点,哪些结点是终端结点?(每小题 5 分,共 15 分) ?(每小题 ,哪些结点是开始结点,哪些结点是终端结点?(1. 【严蔚敏习题集 P7 1.3②】 ② D={d1,d2,d3,d4} {d1,d2,d3,d4} R={ R={(d1,d2),(d2,d3),(d3,d4) } 答: d1→d2→d3→d4 d1→d2→d3→ d1―无直接前驱,是首结点 d1―无直接前驱,d4―无直接后继是尾结点 d4―2.D={d1,d2,…,d9} {d1,d2,…,d9} R={(d1,d2),(d1,d3),(d3,d4 (d3,d6),(d6,d8),(d4,d5 (d6,d7),(d8,d9 R={(d1,d2),(d1,d3),(d3,d4),(d3,d6),(d6,d8),(d4,d5), (d6,d7),(d8,d9) } (d d1―无直接前驱, 2,d5,d7,d9 d5,d7,d9― 答: 此图为树形结构 d1―无直接前驱,是根结点 d2,d5,d7,d9―无直接后继是叶子结点3.D={d1,d2,…,d9} {d1,d2,…,d9} R={(d1,d3),(d1,d8),(d2,d3 (d2,d4),(d2,d5),(d3,d9 (d5,d6),(d8,d9),(d9,d7 (d4,d7 (d4,d6 R={(d1,d3),(d1,d8),(d2,d3),(d2,d4),(d2,d5),(d3,d9), (d5,d6),(d8,d9),(d9,d7), (d4,d7), (d4,d6)} d1,d2―无直接前驱,是开始结点 6,d7 d7― 答: 此图为图形结构 d1,d2―无直接前驱,是开始结点 d6,d7―无直接后继是终端结点(2)(3)④ ⑤第 2 章 自测卷答案题号 题分 得分 一 13 二 10姓名三 10 四 10 五 7 六 10班级七 40 总分 100一、填空(每空 1 分,共 13 分) 填空(1. 【严题集 2.2①】在顺序表中插入或删除一个元素,需要平均移动 表中一半元素,具体移动的元素个数与 表长和 该元素在表中的位置 有关。 2. 线性表中结点的集合是 有限 的,结点间的关系是 一对一 的。3. 向一个长度为 n 的向量的第 i 个元素 ≤i≤n+1)之前插入一个元素时,需向后移动 n-i+1 个元素。 个元素(1≤ ≤ 之前插入一个元素时, 个元素。 之前插入一个元素时 4. 向一个长度为 n 的向量中删除第 i 个元素 ≤i≤n)时,需向前移动 n-i 个元素。 个元素(1≤ ≤ 时 个元素。 5. 在顺序表中访问任意一结点的时间复杂度均为 O(1) ,因此,顺序表也称为 随机存取 的数据结构。 6. 【严题集 2.2①】顺序表中逻辑上相邻的元素的物理位置 必定相邻。单链表中逻辑上相邻的元素的物理位置 不一 定 相邻。 7. 【严题集 2.2①】在单链表中,除了首元结点外,任一结点的存储位置由 其直接前驱结点的链域的值 8. 在 n 个结点的单链表中要删除已知结点*p,需找到它的前驱结点的地址,其时间复杂度为 O(n) 。 指示。(每小题 二、判断正误(在正确的说法后面打勾,反之打叉) 每小题 1 分,共 10 分) 判断正误(在正确的说法后面打勾,反之打叉) (( × )1. 链表的每个结点中都恰好包含一个指针。答:错误。链表中的结点可含多个指针域,分别存放多个指针。例如,双向链表中的结点可以含有两个指针域,分别存放 指向其直接前趋和直接后继结点的指针。( × )2. 链表的物理存储结构具有同链表一样的顺序。错,链表的存储结构特点是无序,而链表的示意图有序。 ( × )3. 链表的删除算法很简单,因为当删除链中某个结点后,计算机会自动地将后续的各个单元向前移动。错,链表的结点不会移动,只是指针内容改变。( × )4. 线性表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。错,混淆了逻辑结构与物理结构,链表也是线性表!且即使是顺序表,也能存放记录型数据。( × )5. 顺序表结构适宜于进行顺序存取,而链表适宜于进行随机存取。错,正好说反了。顺序表才适合随机存取,链表恰恰适于“顺藤摸瓜”( × )6. 顺序存储方式的优点是存储密度大,且插入、删除运算效率高。错,前一半正确,但后一半说法错误,那是链式存储的优点。顺序存储方式插入、删除运算效率较低,在表长为 n 的顺序表中,插入和删除一个数据元素,平均需移动表长一半个数的数据元素。( × )7. 线性表在物理存储空间中也一定是连续的。错,线性表有两种存储方式,顺序存储和链式存储。后者不要求连续存放。( × )8. 线性表在顺序存储时,逻辑上相邻的元素未必在存储的物理位置次序上相邻。错误。线性表有两种存储方式,在顺序存储时,逻辑上相邻的元素在存储的物理位置次序上也相邻。( × )9. 顺序存储方式只能用于存储线性结构。错误。顺序存储方式不仅能用于存储线性结构,还可以用来存放非线性结构,例如完全二叉树是属于非线性结构, 错误。顺序存储方式不仅能用于存储线性结构,还可以用来存放非线性结构,例如完全二叉树是属于非线性结构,但其最佳存储方 式是顺序存储方式。 后一节介绍) (后一节介绍 式是顺序存储方式。 后一节介绍) (( × )10. 线性表的逻辑顺序与存储顺序总是一致的。错,理由同 7。链式存储就无需一致。⑤ ⑥三、单项选择题(每小题 1 分,共 10 分) 单项选择题(( C )1.数据在计算机存储器内表示时,物理地址与逻辑地址相同并且是连续的,称之为: (A)存储结构 (B)逻辑结构 (C)顺序存储结构 (D)链式存储结构 ( B )2.一个向量第一个元素的存储地址是 100,每个元素的长度为 2,则第 5 个元素的地址是 (A)110 (B)108 (C)100 (D)120 ( A )3. 在 n 个结点的顺序表中,算法的时间复杂度是 O(1)的操作是: (A) 访问第 i 个结点(1≤i≤n)和求第 i 个结点的直接前驱(2≤i≤n) (B) 在第 i 个结点后插入一个新结点(1≤i≤n) (C) 删除第 i 个结点(1≤i≤n) (D) 将 n 个结点从小到大排序 ( B )4. 向一个有 127 个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动 个元素 (A)8 (B)63.5 (C)63 (D)7 ( A )5. 链接存储的存储结构所占存储空间: (A) 分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针 (B) 只有一部分,存放结点值 (C) 只有一部分,存储表示结点间关系的指针 (D) 分两部分,一部分存放结点值,另一部分存放结点所占单元数 ( B )6. 链表是一种采用 存储结构存储的线性表; (A)顺序 (B)链式 (C)星式(D)网状( D )7. 线性表若采用链式存储结构时,要求内存中可用存储单元的地址: (A)必须是连续的 (B)部分地址必须是连续的 (C)一定是不连续的 (D)连续或不连续都可以 ( B )8. 线性表L在 情况下适用于使用链式结构实现。 (A)需经常修改L中的结点值 (B)需不断对L进行删除插入 (C)L中含有大量的结点 (D)L中结点结构复杂 ( C )9. 单链表的存储密度 (A)大于 1; (B)等于 1; (C)小于 1; (D)不能确定 )10. 设 a1、a2、a3 为 3 个结点,整数 P0,3,4 代表地址,则如下的链式存储结构称为P0 3 4( BP0 (A)循环链表a13a24A30(B)单链表 (C)双向循环链表(D)双向链表四、简答题(每小题 5 分,共 10 分) 答题(1. 【严题集 2.3②】试比较顺序存储结构和链式存储结构的优缺点。在什么情况下用顺序表比链表好?顺序存储时,相邻数据元素的存放地址也相邻(逻辑与物理统一) 要求内存中可用存储单元的地址必须是连续的。 ;要求内存中可用存储单元的地址必须是连续的 答:① 顺序存储时,相邻数据元素的存放地址也相邻(逻辑与物理统一) 要求内存中可用存储单元的地址必须是连续的。 ; 优点:存储密度大(= (=1?) 存储空间利用率高。缺点:插入或删除元素时不方便。 ,存储空间利用率高 优点:存储密度大(= ?) 存储空间利用率高。缺点:插入或删除元素时不方便。 , 链式存储时,相邻数据元素可随意存放,但所占存储空间分两部分,一部分存放结点值, ②链式存储时,相邻数据元素可随意存放,但所占存储空间分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针 优点:插入或删除元素时很方便,使用灵活。缺点:存储密度小( ) 存储空间利用率低 ,存储空间利用率 优点:插入或删除元素时很方便,使用灵活。缺点:存储密度小(&1) 存储空间利用率低。 , 顺序表适宜于做查找这样的静态操作;链表宜于做插入 删除这样的动态操作 查找这样的静态操作 插入、 这样的动态操作。 顺序表适宜于做查找这样的静态操作;链表宜于做插入、删除这样的动态操作。 若线性表的长度变化不大,且其主要操作是查找,则采用顺序表; 若线性表的长度变化不大,且其主要操作是查找,则采用顺序表;⑥ ⑦若线性表的长度变化较大,且其主要操作是插入、删除操作,则采用链表。 若线性表的长度变化较大,且其主要操作是插入、删除操作,则采用链表。。在单链表中设置头结 2 .【严题集 2.1①】描述以下三个概念的区别:头指针、头结点、首元结点(第一个元素结点) 点的作用是什么?首元结点是指链表中存储线性表中第一个数据元素 的结点。为了操作方便,通常在链表的首元结点之前附设一个结点, 答:首元结点是指链表中存储线性表中第一个数据元素 a1 的结点。为了操作方便,通常在链表的首元结点之前附设一个结点,称为 头结点,该结点的数据域中不存储线性表的数据元素,其作用是为了对链表进行操作时,可以对空表、 头结点,该结点的数据域中不存储线性表的数据元素,其作用是为了对链表进行操作时,可以对空表、非空表的情况以及对首元结点进 对链表进行操作时 行统一处理。头指针是指向链表中第一个结点 或为头结点或为首元结点)的指针。若链表中附设头结点,则不管线性表是否为空表, 是指向链表中第一个结点( 行统一处理。头指针是指向链表中第一个结点(或为头结点或为首元结点)的指针。若链表中附设头结点,则不管线性表是否为空表, 头指针均不为空。否则表示空表的链表的头指针为空。这三个概念对单链表、双向链表和循环链表均适用。是否设置头结点, 头指针均不为空。否则表示空表的链表的头指针为空。这三个概念对单链表、双向链表和循环链表均适用。是否设置头结点,是不同的 存储结构表示同一逻辑结构的问题。 存储结构表示同一逻辑结构的问题。 头结点 head data link 头指针 首元结点简而言之,头指针是指向链表中第一个结点 或为头结点或为首元结点 的指针; 是指向链表中第一个结点( 首元结点) 头指针是指向链表中第一个结点(或为头结点或为首元结点)的指针; 头结点是在链表的首元结点之前附设的一个结点;数据域内只放空表标志和表长等信息(内放头指针?那还得另配一个头指针!! 头结点是在链表的首元结点之前附设的一个结点;数据域内只放空表标志和表长等信息(内放头指针? 那还得另配一个头指针! ) ! 是在链表的首元结点之前附设的一个结点 首元素结点是指链表中存储线性表中第一个数据元素 的结点。 首元素结点是指链表中存储线性表中第一个数据元素 a1 的结点。【软考题】线性表具有两种存储方式,即顺序方式和链接方式。 , , , 五、 软考题】线性表具有两种存储方式,即顺序方式和链接方式。现有一个具有五个元素的线性表 L={23,17,47, 05,31},若它以链接方式存储在下列 100~119 号地址空间中,每个结点由数据(占 2 个字节)和指针(占 2 个字节) , , ~ 个字节) 号地址空间中,每个结点由数据( 个字节)和指针( 组成,如下所示: 组成,如下所示: 05 U 17 X 23 V 31 Y 47 Z ^ ^ 100 120 其中指针 X,Y,Z 的值分别为多少?该线性表的首结点起始地址为多少?末结点的起始地址为多少?(10 分) 答:X= 116 Y= 0 Z= 100 首址= 108 末址= 112⑦ ⑧六、阅读分析题(10 分) 阅读分析题(【严题集 2.10②】指出以下算法中的错误和低效(即费时)之处,并将它改写为一个既正确又高效的算法。 Status DeleteK(SqList&a, int i, int k){ //本过程从顺序存储结构的线性表 a 中删除第 i 个元素起的 k 个元素 if ( i&1 || k&0 || i+k& a.length ) return INFEASIBLE; //参数不合法 else{ for(count = 1; count &k; count ++ ) { //删除一个元素 for ( j = a. j&=i+1; j--) a.elem[j-1] = a.elem[j]; a.length - -; } return OK; } // DeleteK注:上题涉及的类型定义如下: # define LIST INIT SIZE 100 # define LISTINCREMENT 10 typedef struct { Elem Type * I I }SqL//存储空间基址 //当前长度 //当前分配的存储容量答:错误有两处: ① 参数不合法的判别条件不完整。例如表长为 10,若从第一位置(i=1)删除 10 个元素(k=10),要求合理但会被判 为非法。 合法的入口参数条件为(0&i≤a.length)^ (0≤k≤a.length-i) 应将 if ( i&1 || k&0 || i+k& a.length ) return INFEASIBLE 改为:if (! ((0&i≤a.length)^ (o≤k≤a.length-i))) return INFEASIBLE 第二个 FOR 语句中,元素前移的次序错误。应将 for ( j = a. j&=i+1; j--) a.elem[j-1] = a.elem[j]; 改为 for (j&=i+1; j = a. j++) a.elem[j-1] = a.elem[j];七、编程题(每题 10 分,共 40 分) 编程题(1. 【徐士良题集,2002 年 1 月省统考题】写出在顺序存储结构下将线性表逆转的算法,要求使用最少的附加空间。 解:输入:长度为 n 的线性表数组 A(1:n) invsl(n,a) 输出:逆转后的长度为 n 的线性表数组 A(1:n)。 C 语言描述如下(其中 ET 为数据元素的类型) : ET a[]; { ET for (k=1; k&=n/2; k++) {t=a[k-1]; a[k-1]=a[n-k]; a[n-k]=t;} }⑧ ⑨2. 【严题集 2.6②】已知 L 是无表头结点的单链表,且 P 结点既不是首元结点,也不是尾元结点,请写出在 P 结点后 插入 S 结点的核心语句序列。 答:此题答案不唯一,但若从已给定序列中挑选,则限制颇多。 (7) Q=P; (11) P=L; 已知 P 结点,则不必“顺藤摸瓜” ,直接链 (8) while(P-&next!=Q)P=P-& 接即可。 (10) P=Q; (4) S-&next=P-& (4) S-&next=P-& (1) P-&next=S; P-&next=S; 3. 编写程序,将若干整数从键盘输入,以单链表形式存储起来,然后计算单链表中结点的个数(其中指针 P 指向该链 表的第一个结点) 注:统计结点个数是【省统考样题】的要求,也是教材 P60 4-6 计算链表长度的要求,编程又简 。 单,很容易作为考题。 解:编写 C 程序如下(已上机通过): 全局变量及函数提前说明: --------------------------------#include&stdio.h& #include&stdlib.h& typedef struct liuyu{struct liuyu*} liuyu *p,*q,*r,* int m=sizeof(test); void main () /*第一步,从键盘输入整数,不断添加到链表*/ { head=(test*)malloc(m); /*m=sizeof(test);*/ p= i=0; while (i!=-9999) { printf(&/ninput an integer [stop by '-9999']:&); scanf(&%d&,&i); p-&data=i; /* input data is saved */ p-&link=(test*)malloc(m); /*m=sizeof(test));*/ q=p; p=p-& } q-&link=NULL; /*原先用 p-&link=NULL 似乎太晚!*/p= i=0; /*统计链表结点的个数并打印出来*/ while (p-&link!=NULL) {printf(&%d&,p-&data); p=p-& i++; } printf(&\n node number=%d\n&, i-1); /*结点的个数不包括-9999*/ } 0301 陈建武: 3.程序中统计结点数应是 i 个,而不是 i-1. 假设链表表长为 n,i 从 0 开始,则在统计某一结点后 i 加一,此时 p 已指向下一个结点, 第一结点统计结束,i 为 1,p 指向第二结点 即当 p 指向尾结点(第 n 个结点)时 i 的值为 n-1,while 循环条件不符(指针域为 null),退出循环,即得统计的结点数,为 n-1.所以 i 的值就是结点数,不必再减一⑨ ⑩个字母按特定字母值插入或删除的完整程序,可自行选用顺序存储或链表结构 或链表结构。 请编写 26 个字母按特定字母值插入或删除的完整程序,可自行选用顺序存储或链表结构。 答:4.#include&stdio.h& /*全局变量及函数提前说明:*/ 全局变量及函数提前说明: 全局变量及函数提前说明 #include&stdlib.h& typedef struct liuyu{struct liuyu*} liuyu *p,*q,*r,* int L; /*元素的个数 元素的个数*/ 元素的个数 int m=sizeof(test); void build(); /* 主函数中会被调用的函数应当预先说明 */ 主函数中会被调用的函数应当预先说明 void display(); int insert_char(char,char); /*插入一个字母,在第字母 Y 之前,若无字母则加到末尾 插入一个字母, 之前,若无字母则加到末尾*/ 插入一个字母 int delet_char(char); /* 删除元素 X,注意保存 X 的前趋元素指针! */ , 的前趋元素指针! /*---------------------------------------------------------*/ void build() /*字母链表的生成 字母链表的生成*/ 字母链表的生成 { head=(test*)malloc(m); /*m=sizeof(test);*/ p= for(i=1;i&L;i++) { p-&data=i+'a'-1; /* 'a'也可用其 ASCII 码 97 来表示 */ 也可用其 p-&link=(test*)malloc(m); /*m=sizeof(test));*/ p=p-& } p-&data=i+'a'-1; p-&link=NULL; } /*---------------------------------------------------------*/ void display() /*字母链表的输出 字母链表的输出*/ 字母链表的输出 {p= while (p-&link!=NULL) { printf(&%c&,p-&data); p=p-& } printf(&%c\n&,p-&data); } /*---------------------------------------------------------*/ int insert_char(char X,char Y) /*插入一个字母 X 在某个字母 Y 之前,若找不到 Y 字母则加到末尾 之前, 字母则加到末尾*/ 插入一个字母 {p= r=(test*)malloc(m); r-&data=X; if(head-&data==Y) { head=r; r-&link=p; } else{ while((p-&data!=Y)&&(p-&link!=NULL)) {q=p; p=p-&} if(p-&data==Y) { q-&link=r; r-&link=p; } else{p-&link=r;r-&link=NULL;} } L++; return(0); } /*---------------------------------------------------------*/ int delet_char(char X) /* 删除元素 X,注意保存 X 的前趋元素指针! */ 的前趋元素指针! , { p= if(head-&data==X){head=head-&free(p);} else{ while((p-&data!=X)&&(p-&link!=NULL)) {q=p; p=p-&} if(p-&data==X) { q-&link=p-& free(p); } else return(-1); } L--; return(0); }⑩ 11/*---------------------------------------------------------*/ void main(void) /*字母线性表的生成和输出 字母线性表的生成和输出*/ 字母线性表的生成和输出 { L=26; build(); display(); printf(&insert return value=%d\n&,insert_char('L','W')); display(); printf(&delete return value=%d\n&,delet_char('z')); display(); } 屏幕上显示的执行结果是: 附:屏幕上显示的执行结果是: abcdefghijklmnopqrstuvwxyz insert return value=0 abcd9efghijklmnopqrstuvwxyzL delete return value=0 abcdefghijklmnopqrstuvwxyL11 120301 陈建武修改意见: 一. display()函数代码可优化为四行 void display() /*字母链表的输出*/ {p= while (p-&link!=NULL)//改为 while(p),因为当 p 指向尾结点时,p 不为 null,条件成立循环, //printf(),然后 p 被赋值为 null,此时循环条件不符退出,正好. { printf(&%c&,p-&data); p=p-& } printf(&%c\n&,p-&data); //用 while(p),此行可删 } 二.对 int insert_char(char X,char Y) ,若用带头结点的链表,代码可减为 10 行 我的程序如下(若参数没有 slist p,代码要多一行,让 q 指向头指针) void InsertFind(slist p,char insertchar,char insertpos)//字母 insertpos 前插入字母 insertchar { slist pprior, //newnode 新结点,pprior 为插入位置结点的直接前驱 newnode = //为新结点分配内存 newnode-&data = //对结点数据域初始化 while(p) //当 p 指向尾结点时最后一次循环 { pprior = //pprior 从头指针开始,指向 p 的直接前驱 p = p-& //p 从首元结点开始,不断前移 ,直至最后,p 为 null if(p&&(p-&data == insertpos)) //当 p 为 null 或者结点 p 的数据域为所要插入的字母, //则退出循环 } newnode-&next = pprior-& //在找到的位置前插入 pprior-&next = } 对删除结点的操作,若有头结点,同样可以减少代码,由此可见创建一个头结点对简化程序有很大的帮助. 上面的观点,仅供参考,不对之处,请指教!12 13第 3 章 栈和队列 自测卷答案题号 题分 得分 一 15 二 10 三 20姓名四 20班级五 20 六 15 总分 100一、填空题(每空 1 分,共 15 分) 填空题(1. 【李春葆】 量、 李春葆】 结构, 位置插入和删除元素; 向 栈和队列都是 线性 结构, 可以在向量的 任何 位置插入和删除元素; 对于栈只能在 插入和删除元素; 删除元素。 顶 插入和删除元素;对于队列只能在 队尾 插入和 队首 删除元素。 2. 栈是一种特殊的线性表,允许插入和删除运算的一端称为 。不允许插入和删除运算的一端称为 栈顶 。 底 3. 队列 是被限定为只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。 位置。 4. 在一个循环队列中,队首指针指向队首元素的 前一个 5. 在具有 n 个单元的循环队列中,队满时共有 n-1 个元素。 6. 向栈中压入元素的操作是先 移动栈顶指针 ,后 存入元素 。 先 7. 从循环队列中删除一个元素时,其操作是 先 移动队首指针 ,后 取出元素 。 。 8. 〖00 年统考题〗带表头结点的空循环双向链表的长度等于 0 解: head L=head 头结点 R=head ) 二、判断正误(判断下列概念的正确性,并作出简要的说明。(每小题 1 分,共 10 分) 判断正误(判断下列概念的正确性,并作出简要的说明。 ( × )1. 线性表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。错,线性表是逻辑结构概念,可以顺序存储或链式存储,与元素数据类型无关。栈 栈( × ( √ ( √)2. 在表结构中最常用的是线性表,栈和队列不太常用。错,不一定吧?调用子程序或函数常用,CPU 中也用队列。)3. 栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。 )4. 对于不同的使用者,一个表结构既可以是栈,也可以是队列,也可以是线性表。正确,都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。( × )5. 栈和链表是两种不同的数据结构。错,栈是逻辑结构的概念,是特殊殊线性表,而链表是存储结构概念,二者不是同类项。( × )6. 栈和队列是一种非线性数据结构。错,他们都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。( √ ( √)7. 栈和队列的存储方式既可是顺序方式,也可是链接方式。 )8. 两个栈共享一片连续内存空间时,为提高内存利用率,减少溢出机会,应把两个栈的栈底分别设在这 片内存空间的两端。 ( × )9. 队是一种插入与删除操作分别在表的两端进行的线性表,是一种先进后出型结构。错,后半句不对。( × )10. 一个栈的输入序列是 12345,则栈的输出序列不可能是 12345。错,有可能。三、单项选择题(每小题 1 分,共 20 分) ( B )1. 〖00 年元月统考题〗栈中元素的进出原则是 A.先进先出 B.后进先出 C.栈空则进 ( C 则 pi 为D.栈满则出)2. 〖李春葆〗若已知一个栈的入栈序列是 1,2,3,…,n,其输出序列为 p1,p2,p3,…,pn,若 p1=n,A.i B.n=i C.n-i+1 D.不确定 解释:当 p1=n,即 n 是最先出栈的,根据栈的原理,n 必定是最后入栈的,那么输入顺序必定是 1,2,3,…,n,则13 14出栈的序列是 n,…,3,2,1。 ( B )3. 〖李春葆〗判定一个栈 ST(最多元素为 m0)为空的条件是 A.ST-&top&&0 B.ST-&top=0 C.ST-&top&&m0D.ST-&top=m0(B)4. 〖李春葆〗判定一个队列 QU(最多元素为 m0)为满队列的条件是 A.QU-&rear - QU-&front = = m0 B.QU-&rear - QU-&front -1= = m0 C.QU-&front = = QU-&rear D.QU-&front = = QU-&rear+1 )5.数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定 队列中元素的个数小于n,计算队列中元素的公式为 (A)r-f; (B) (n+f-r)% (C)n+r-f; (D) (n+r-f)% n(D6. 【98 初程 P71】 从供选择的答案中,选出应填入下面叙述 ? 内的最确切的解答,把相应编号写在答卷的对 应栏内。 设有 4 个数据元素 a1、a2、a3 和 a4,对他们分别进行栈操作或队操作。在进栈或进队操作时,按 a1、a2、a3、 a4 次序每次进入一个元素。假设栈或队的初始状态都是空。 现要进行的栈操作是进栈两次,出栈一次,再进栈两次,出栈一次;这时,第一次出栈得到的元素是 A ,第 二次出栈得到的元素是 B 是;类似地,考虑对这四个数据元素进行的队操作是进队两次,出队一次,再进队 两次,出队一次;这时,第一次出队得到的元素是 C ,第二次出队得到的元素是 D 。经操作后,最后在 栈中或队中的元素还有 E 个。 供选择的答案: A~D:①a1 ②a2 ③ a3 ④a4 E: ①1 ②2 ③ 3 ④ 0 答:ABCDE=2, 4, 1, 2, 2 7. 【94 初程 P75】 从供选择的答案中,选出应填入下面叙述 ? 内的最确切的解答,把相应编号写在答卷的对 应栏内。 栈是一种线性表,它的特点是 A 。设用一维数组 A[1,…,n]来表示一个栈,A[n]为栈底,用整型变量 T 指示当 前栈顶位置,A[T]为栈顶元素。往栈中推入(PUSH)一个新元素时,变量 T 的值 B ;从栈中弹出(POP)一个 元素时,变量 T 的值 C 。设栈空时,有输入序列 a,b,c,经过 PUSH,POP,PUSH,PUSH,POP 操作后,从 栈中弹出的元素的序列是 D ,变量 T 的值是 E 。 供选择的答案: A: ① 先进先出 ②后进先出 ③进优于出 ④出优于进 ⑤ 随机进出 B,C: ① 加 1 ②减 1 ③不变 ④清 0 ⑤ 加 2 ⑥减 2 D:① a,b ②b,c ③c,a ④b,a ⑤ c,b ⑥ a,c E:① n+1 ②n+2 ③ n ④ n-1 ⑤ n-2 答案:ABCDE=2, 2, 1, 6, 4注意,向地址的高端生长,称为向上生成堆栈;向地址低端生长叫向下生成堆栈,本题中底部为 n,向地址的低端递减生成,称为向下生 成堆栈。8. 【91 初程 P77】 从供选择的答案中,选出应填入下面叙述 ? 内的最确切的解答,把相应编号写在答卷的对 应栏内。 在做进栈运算时,应先判别栈是否 A ;在做退栈运算时,应先判别栈是否 B 。当栈中元素为 n 个,做进 栈运算时发生上溢,则说明该栈的最大容量为 C 。 为了增加内存空间的利用率和减少溢出的可能性,由两个栈共享一片连续的内存空间时,应将两栈的 D 分别设在 这片内存空间的两端,这样,只有当 E 时,才产生上溢。 供选择的答案: A,B:①空 ② 满 ③ 上溢 ④ 下溢 C: ①n-1 ② n ③ n+1 ④ n/214 15D: ① 长度 ②深度 ③ 栈顶 ④ 栈底 E:①两个栈的栈顶同时到达栈空间的中心点 ②其中一个栈的栈顶到达栈空间的中心点 ③两个栈的栈顶在达栈空间的某一位置相遇 ④两个栈均不空,且一个栈的栈顶到达另一个栈的栈底 答案:ABCDE=2, 1, 2, 4, 3四、简答题(每小题 4 分,共 20 分) 简答题(1. 【严题集 3.2①和 3.11①】说明线性表、栈与队的异同点。刘答:相同点:都是线性结构,都是逻辑结构的概念。都可以用顺序存储或链表存储;栈和队列是两种特殊的线性表,即受限的线性表, 刘答: 都是线性结构,都是逻辑结构的概念。都可以用顺序存储或链表存储;栈和队列是两种特殊的线性表,即受限的线性表, 都是线性结构 只是对插入、删除运算加以限制。 只是对插入、删除运算加以限制。 不同点:①运算规则不同,线性表为随机存取,而栈是只允许在一端进行插入、删除运算,因而是后进先出表 LIFO;队列是只允许在一 运算规则不同, 运算规则不同 线性表为随机存取,而栈是只允许在一端进行插入、删除运算, ; 端进行插入、另一端进行删除运算, 端进行插入、另一端进行删除运算,因而是先进先出表 FIFO。 。 ② 用途不同,堆栈用于子程调用和保护现场,队列用于多道作业处理、指令寄存及其他运算等等。2. 【统考书 P60 4-11,难于严题集 3.1①】设有编号为 1,2,3,4 的四辆列车,顺序进入一个栈式结构的车站,具体 写出这四辆列车开出车站的所有可能的顺序。刘答:至少有 14 种。 ① 全进之后再出情况,只有 1 种:4,3,2,1 ② 进 3 个之后再出的情况,有 3 种,3,4,2,1 3,2,4,1 3,2,1,4 ③ 进 2 个之后再出的情况,有 5 种,2,4,3,1 2,3,4,1 2,1, 3,4 2,1,4,3 2,1,3,4 ④ 进 1 个之后再出的情况,有 5 种,1,4,3,2 1,3,2,4 1,3,4,2 1, 2,3,4 1,2,4,33. 【刘自编】 刘自编】 是回文, 假设正读和反读都相同的字符序列为 回文” 例如, abba’ ‘abcba’ “回文” 例如, , ‘ ’ 和 ’ 是回文, abcde’ 和 ababab’ ‘ ’ ‘ ’ 则不是回文。假设一字符序列已存入计算机,请分析用线性表、堆栈和队列等方式正确输出其回文的可能性? 则不是回文。假设一字符序列已存入计算机,请分析用线性表、堆栈和队列等方式正确输出其回文的可能性? 答:线性表是随机存储,可以实现,靠循环变量(j--)从表尾开始打印输出; 堆栈是后进先出,也可以实现,靠正序入栈、逆序出栈即可; 队列是先进先出,不易实现。 哪种方式最好,要具体情况具体分析。若正文在机内已是顺序存储,则直接用线性表从后往前读取即可,或将堆 栈栈顶开到数组末尾,然后直接用 POP 动作实现。 (但堆栈是先减后压还是……) 若正文是单链表形式存储,则等同于队列,需开辅助空间,可以从链首开始入栈,全部压入后再依次输出。4. 【统考书 P60 4-13】顺序队的“假溢出”是怎样产生的?如何知道循环队列是空还是满? 顺序队的“ 顺序队的 假溢出”是怎样产生的?如何知道循环队列是空还是满?答:一般的一维数组队列的尾指针已经到了数组的上界,不能再有入队操作,但其实数组中还有空位置,这就叫“假溢出” 。 采用循环队列是解决假溢出的途径。 另外,解决队满队空的办法有三: ① 设置一个布尔变量以区别队满还是队空; ② 浪费一个元素的空间,用于区别队满还是队空。 ③ 使用一个计数器记录队列中元素个数(即队列长度) 。 我们常采用法②,即队头指针、队尾指针中有一个指向实元素,而另一个指向空闲元素。 判断循环队列队空标志是: f=rear 队满标志是:f=(r+1)%N5. 【统考书 P60 4-14】设循环队列的容量为 40(序号从 0 到 39) ,现经过一系列的入队和出队运算后,有 】 ① front=11,rear=19; ② front=19,rear=11;问在这两种情况下,循环队列中各有元素多少个? 答:用队列长度计算公式: (N+r-f)% N ① L=(40+19-11)% 40=8 ② L=(40+11-19)% 40=32至少要写出思路) 五、阅读理解(每小题 5 分,共 20 分。至少要写出思路) 阅读理解( 1. 【严题集 3.7①】按照四则运算加、减、乘、除和幂运算(↑)优先关系的惯例,并仿照教材例 3-2 的格式,画出 例 对下列算术表达式求值时操作数栈和运算符栈的变化过程: A-B×C/D+E↑F15 16答:2. 【严题集 3.3②】写出下列程序段的输出结果(栈的元素类型 SElem Type 为 char) 。 void main( ){ Stack S; Char x,y; InitStack(S); X=’c’;y=’k’; Push(S,x); Push(S,’a’); Push(S,y); Pop(S,x); Push(S,’t’); Push(S,x); Pop(S,x); Push(S,’s’); while(!StackEmpty(S)){ Pop(S,y);printf(y); }; Printf(x); } 答:输出为“stack” 。 3. 【严题集 3.12②】写出下列程序段的输出结果(队列中的元素类型 QElem Type 为 char) 。 void main( ){ Queue Q; Init Queue (Q); Char x=’e’; y=’c’; EnQueue (Q,’h’); EnQueue (Q,’r’); EnQueue (Q,’y’); DeQueue (Q,x); EnQueue (Q,x); DeQueue (Q,x); EnQueue (Q,’a’); while(!QueueEmpty(Q)){ DeQueue (Q,y);printf(y); }; Printf(x); }16 17答:输出为“char” 。 4. 【严题集 3.13②】简述以下算法的功能(栈和队列的元素类型均为 int) 。 void algo3(Queue &Q){ Stack S; InitStack(S); while(!QueueEmpty(Q)){ DeQueue (Q,d); Push(S,d); }; while(!StackEmpty(S)){ Pop(S,d); EnQueue (Q,d); } } 答:该算法的功能是:利用堆栈做辅助,将队列中的数据元素进行逆置。至少要写出思路) 六、算法设计(每小题 5 分,共 15 分。至少要写出思路) 算法设计( 1. 【李春葆及严题集 3.19④】假设一个算术表达式中包含圆括弧、方括弧和花括弧三种类型的括弧,编写一个判别 表达式中括弧是否正确配对的函数 correct(exp,tag);其中:exp 为字符串类型的变量(可理解为每个字符占用一个 数组元素) ,表示被判别的表达式,tag 为布尔型变量。 答:用堆栈 st 进行判定, ( 、 [ 或 { 入栈,当遇到 } 、 ] 或 ) 时, 将 检查当前栈顶元素是否是对应的( 、 [ 或 {,若是则退栈,否则返回表示不配对。当整个算术表达式检查完毕时,若栈为空表示括号正确配对,否则不配对。 编程后的整个函数如下(李书 P31―32) #define m0 100 /*m0 为算术表达式中最多字符个数*/ correct(exp,tag) char exp[m0]; {char st[m0]; int top=0, i=1; tag=1; while (i&=m0 && tag) {if (exp[i]= = ‘(‘||exp[i]= =’[‘||exp[i]= =’{‘) /*遇到‘(‘、’[‘或’{‘,则将其入栈*/ {top++; st[top]=exp[i]; } if (exp[i]= =’)’ ) /*遇到’)’ ,若栈顶是‘(‘,则继续处理,否则以不配对返回*/ if(st[top]= =‘(‘ ) top--; else tag=0; if (exp[i]= =’ )’ ) /*遇到’ ]’ ,若栈顶是‘[‘,则继续处理,否则以不配对返回*/ if(st[top]= =‘[ ‘] top--; else tag=0; if (exp[i]= =’)’ ) /*遇到’ }’ ,若栈顶是‘{‘,则继续处理,否则以不配对返回*/ if(st[top]= =‘{‘ top--; else tag=0; i++; } if(top&0)tag=0; /*若栈不空,则不配对*/ } 严题集对应答案: 3.19 Status AllBrackets_Test(char *str)//判别表达式中三种括号是否匹配17 18{ InitStack(s); for(p=*p;p++) { if(*p=='('||*p=='['||*p=='{') push(s,*p); else if(*p==')'||*p==']'||*p=='}') { if(StackEmpty(s)) return ERROR; pop(s,c); if(*p==')'&&c!='(') return ERROR; if(*p==']'&&c!='[') return ERROR; if(*p=='}'&&c!='{') return ERROR; //必须与当前栈顶括号匹配 } }//for if(!StackEmpty(s)) return ERROR; return OK; }//AllBrackets_Test 假设一个数组 squ[m]存放循环队列的元素。 若要使这 m 个分量都得到利用, 则需另一个标志 tag, 2. 【统考书 P60 4-15】 以 tag 为 0 或 1 来区分尾指针和头指针值相同时队列的状态是“空”还是“满” 。试编写相应的入队和出队的算法。 解:这就是解决队满队空的三种办法之① 设置一个布尔变量以区别队满还是队空(其他两种见简答题) ; 思路:一开始队空,设 tag=0,若从 rear 一端加到与 front 指针相同时,表示入队已满,则令 tag=1; 若从 front 一端加到与 rear 指针相同时,则令 tag=0,表示出队已空。3.【严题集 3.31③】试写一个算法判别读入的一个以‘@’为结束符的字符序列是否是“回文” 试写一个算法判别读入的一个以‘ ’为结束符的字符序列是否是“回文” 试写一个算法判别读入的一个以 。 答:编程如下: int Palindrome_Test()//判别输入的字符串是否回文序列,是则返回 1,否则返回 0 { InitStack(S);InitQueue(Q); while((c=getchar())!='@') { Push(S,c);EnQueue(Q,c); //同时使用栈和队列两种结构 } while(!StackEmpty(S)) { Pop(S,a);DeQueue(Q,b)); if(a!=b) return ERROR; } return OK; }//Palindrome_Test18 19第 4~5 章 串和数组 自测卷答案 ~题号 题分 得分 一 20 二 15姓名三 20 四 15班级五 30 总分 100一、填空题(每空 1 分,共 20 分) 1. 不包含任何字符(长度为 0)的串 称为空串; 由一个或多个空格(仅由空格符)组成的串 (对应严题集 4.1①,简答题:简述空串和空格串的区别) 2. 设 S=“A;/document/Mary.doc” ,则 strlen(s)= 20 , “/”的字符定位的位置为 称为目标串, 子串 次匹配成功。 3 。称为空白串。4. 子串的定位运算称为串的模式匹配; 被匹配的主串 5. 设目标 T=”abccdcdccbaa”,模式 P=“cdcc” ,则第 6称为模式。6. 若 n 为主串长,m 为子串长,则串的古典(朴素)匹配算法最坏的情况下需要比较字符的总次数为 (n-m+1)*m 。 7. 假设有二维数组 A6×8,每个元素用相邻的 6 个字节存储,存储器按字节编址。已知 A 的起始存储位置(基地址) 为 1000,则数组 A 的体积(存储量)为 288 B ;末尾元素 A57 的第一个字节地址为 1282 ;若按行存储 时,元素 A14 的第一个字节地址为 (8+4)×6+ ;若按列存储时,元素 A47 的第一个字节地址为 (6×7 +4)×6+1000)=1276 。 8. 〖00 年计算机系考研题〗设数组 a[1…60, 1…70]的基地址为 2048,每个元素占 2 个存储单元,若以列序为主序顺 序存储,则元素 a[32,58]的存储地址为 9188 。 (58 字节+ 答:考虑 0 行 0 列, ( 列×61 行+32 行)×2 字节+基址 ?? ?? 9. 三元素组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素 的 行下标 、 列下标 和 元素值 。 10.求下列广义表操作的结果: (1) GetHead【((a,b),(c,d))】=== (a, b) ; //头元素不必加括号 (2) GetHead【GetTail【((a,b),(c,d))】 】=== (c,d) ; (3) GetHead【GetTail【GetHead【((a,b),(c,d))】】=== 】 ; (4) GetTail【GetHead【GetTail【((a,b),(c,d))】】=== (d) 】 二、单选题(每小题 1 分,共 15 分) ( B )1. 〖李〗串是一种特殊的线性表,其特殊性体现在: A.可以顺序存储 B.数据元素是一个字符 C.可以链式存储 D.数据元素可以是多个字符 ( B )2. 〖李〗设有两个串 p 和 q,求 q 在 p 中首次出现的位置的运算称作: A.连接 B.模式匹配 C.求子串 D.求串长 ( D )3. 〖李〗设串 s1=’ABCDEFG’,s2=’PQRST’,函数 con(x,y)返回 x 和 y 串的连接串,subs(s, i, j)返回串 s 的 从序号 i 开始的 j 个字符组成的子串,len(s)返回串 s 的长度,则 con(subs(s1, 2, len(s2)), subs(s1, len(s2), 2))的结果串是: A.BCDEF B.BCDEFG C.BCPQRST D.BCDEFEF 解:con(x,y)返回 x 和 y 串的连接串,即 con(x,y)=‘ABCDEFGPQRST’ ; subs(s, i, j)返回串 s 的从序号 i 开始的 j 个字符组成的子串,则 subs(s1, 2, len(s2))=subs(s1, 2, 5)=’ BCDEF’; subs(s1, len(s2), 2)=subs(s1, 5, 2)=’ EF’;19 20所以 con(subs(s1, 2, len(s2)), subs(s1, len(s2), 2))=con(’ BCDEF’, ’ EF’)之连接,即 BCDEFEF ( A )4. 〖01 年计算机系考研题〗假设有 60 行 70 列的二维数组 a[1…60, 1…70]以列序为主序顺序存储,其基地址 为 10000,每个元素占 2 个存储单元,那么第 32 行第 58 列的元素 a[32,58]的存储地址为 。 (无第 0 行第 0 列元 素) A.16902 B.16904 C.14454 D.答案 A, B, C 均不对 答: (57 列×60 行+31 行)×2 字节+(A) ( 字节+ ( B )5. 设矩阵 A 是一个对称矩阵,为了节省存储,将其下三角部分(如下图所示)按行序存放在一维数组 B[ 1, n(n-1)/2 ]中,对下三角部分中任一元素 ai,j(i≤j), 在一维数组 B 中下标 k 的值是: A.i(i-1)/2+j-1 B.i(i-1)/2+j C.i(i+1)/2+j-1 D.i(i+1)/2+j 解:注意 B 的下标要求从 1 开始。 先用第一个元素去套用,可能有 B 和 C; 再用第二个元素去套用 B 和 C, B=2 而 C=3 不符) ( ; 所以选 B?a1,1 ? a2,1 A= ? ?? ? ?an ,1 ??a 2, 2 an ,2? ? ? ? ? ? a n ,n ? ?6. 【91 初程 P78】 从供选择的答案中,选出应填入下面叙述内的最确切的解答,把相应编号写在答卷的对应栏内。 有一个二维数组 A,行下标的范围是 0 到 8,列下标的范围是 1 到 5,每个数组元素用相邻的 4 个字节存储。存储 器按字节编址。假设存储数组元素 A[0,1]的第一个字节的地址是 0。 存储数组 A 的最后一个元素的第一个字节的地址是 A 。若按行存储,则 A[3,5]和 A[5,3]的第一个字节的地址分 别是 B 和 C 。若按列存储,则 A[7,1]和 A[2,4]的第一个字节的地址分别是 D 和 E 。 供选择的答案 A~E:①28 ② 44 ③ 76 ④ 92 ⑤ 108 ⑥ 116 ⑦ 132 ⑧ 176 ⑨ 184 ⑩ 188 答案:ABCDE=8, 3, 5, 1, 6 7.【94 程 P12】 从供选择的答案中,选出应填入下面叙述 ? 内的最确切的解答,把相应编号写在答卷的对应 栏内。 有一个二维数组 A,行下标的范围是 1 到 6,列下标的范围是 0 到 7,每个数组元素用相邻的 6 个字节存储,存储 器按字节编址。那么,这个数组的体积是 A 个字节。假设存储数组元素 A[1,0]的第一个字节的地址是 0,则存储 数组 A 的最后一个元素的第一个字节的地址是 B 。若按行存储,则 A[2,4]的第一个字节的地址是 C 。若按 列存储,则 A[5,7]的第一个字节的地址是 D 。 供选择的答案 A~D:①12 ② 66 ③ 72 ④ 96 ⑤ 114 ⑥ 120 ⑦ 156 ⑧ 234 ⑨ 276 ⑩ 282 (11)283 (12)288 答案:ABCD=12, 10, 3, 9三、简答题(每小题 5 分,共 15 分) 简答题(1. KMP 算法的设计思想是什么?它有什么优点? 算法的设计思想是什么?它有什么优点? 2. (软件技术?)已知二维数组 Am,m 采用按行优先顺序存放,每个元素占 K 个存储单元,并且第一个元素的存储地 址为 Loc(a11),请写出求 Loc(aij)的计算公式。如果采用列优先顺序存放呢? 解:公式教材已给出,此处虽是方阵,但行列公式仍不相同;20 21按行存储的元素地址公式是: Loc(aij)= Loc(a11) +[ (i-1)*m+(j-1) ] * K 按列存储的元素地址公式是: Loc(aij)= Loc(a11) +[ (j-1)*m+(i-1) ] * K 3.【全国专升本资格考试】递归算法比非递归算法花费更多的时间,对吗?为什么? 不一定。 有关,是指最深层的执行语句耗费时间, 答:不一定。时间复杂度与样本个数 n 有关,是指最深层的执行语句耗费时间,而递归算法与非递归算法在最深层的 语句执行上是没有区别的 循环的次数也没有太大差异。仅仅是确定循环是否继续的方式不同, 有区别的, 语句执行上是没有区别的,循环的次数也没有太大差异。仅仅是确定循环是否继续的方式不同,递归用栈隐含循环次 数,非递归用循环变量来显示循环次数而已。 非递归用循环变量来显示循环次数而已。 四、计算题(每题 5 分,共 20 分) 计算题( 1. 设 s=’I AM A STUDENT’, t=’GOOD’, q=’WORKER’, 求 Replace(s,’STUDENT’,q) 和 Concat(SubString(s,6,2), Concat(t,SubString(s,7,8)))。 解:① Replace(s,’STUDENT’,q)=’I AM A WORKER’ ② 因为 SubString(s,6,2)=‘A ’ ;SubString(s,7,8)=‘ STUDENT’ Concat(t,SubString(s,7,8))=’GOOD STUDENT’ 所以 Concat(SubString(s,6,2), Concat(t,SubString(s,7,8)))=‘A GOOD STUDENT’ 写出模式串的 nextval 2.【严题集 4.8②】已知主串 s=’ADBADABBAABADABBADADA’,模式串 pat=’ADABBADADA’。 函数值,并由此画出 KMP 算法匹配的全过程。 解: (由演示程序得知)nextval 函数值为 0 1 0 2 1 0 1 0 4 0 在第 12 个字符处发现匹配! s=’ADBADABBAABADABBADADA’ pat=’ADABBADADA’ 3. (P60 4-18)用三元组表表示下列稀疏矩阵:?? ?? ? ? ?? ? ? ?? (1) ?? ? ? ?? ?? ? ? ???00000 ? 2? ?00009 0? ? ? ?00000 0? ( 2) ? ? ?00500 0? ?00000 0? ? ? ?00003 0 ?解:参见填空题 4. 三元素组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素 的 行下标 、 列下标 和 元素值 。 所以(1)可列表为: (2)可列表为: 5 8 8 6 6 4 3 2 3 1 6 -2 3 6 8 2 5 9 5 4 6 4 3 5 7 8 5 6 5 3 8 1 24. (P60 4-19)下列各三元组表分别表示一个稀疏矩阵,试写出它们的稀疏矩阵。21 22?6 4 6 ? ?1 2 2 ? ? ? ?1 ? 2 12? ? ? (1) ?3 1 3 ? ?4 4 4 ? ? ? ?5 3 6 ? ?6 1 16 ? ? ?0 2 12 0 3 0 0 0 0 0 16 0 0 0 0 0 0 0 0 4 6 0 0 0?4 5 5 ? ?1 1 1 ? ? ? ? 2 4 9? ( 2) ? ? ?3 2 8 ? ?3 5 6 ? ? ? ?4 3 7 ?解: (1)为 6×4 矩阵,非零元素有 6 个,但其中一数下标有误?(2)为 4×5 矩阵,非零元素有 5 个 改为 2,1,12 1 0 0 0 0 0 8 0 0 0 0 7 0 9 0 0 0 0 6 0算法设计题( 五、算法设计题(每题 10 分,共 30 分) ③ 的算法。 1. 【严题集 4.12③】 编写一个实现串的置换操作 Replace(&S, T, V)的算法。 的算法 解: int Replace(Stringtype &S,Stringtype T,Stringtype V);//将串 S 中所有子串 T 替换为 将串 V,并返回置换次数 并返回置换次数 { for(n=0,i=1;i&=Strlen(S)-Strlen(T)+1;i++) //注意 i 的取值范围 注意 if(!StrCompare(SubString(S,i,Strlen(T)),T)) //找到了与 T 匹配的子串 找到了与 { //分别把 T 的前面和后面部分保存为 head 和 tail StrAssign(head,SubString(S,1,i-1)); StrAssign(tail,SubString(S,i+Strlen(T),Strlen(S)-i-Strlen(T)+1)); StrAssign(S,Concat(head,V)); StrAssign(S,Concat(S,tail)); //把 head,V,tail 连接为新串 i+=Strlen(V); //当前指针跳到插入串以后 n++; n++; }// }//Replace 分析:i+=Strlen(V);这一句是必需的,也是容易忽略的.如省掉这一句,则在某些情况下, 会引起不希望的后果,虽然在大多 数情况下没有影响.请思考:设 S='place', T='ace', V='face',则省掉 i+=Strlen(V);运行时会出现什么结果? 2. 【全国专升本资格考试】写出将字符串反序的递归 递推 递归或递推 ,反序为“wxscba”(注: 递归 递推算法,例如字符串为“abcsxw” 这也是严题集 4.10③ 编写对串求逆的递推算法) 算法思路: ① 假定用单链表结构存储字符串; if 没有到尾部字符就不停调用自身函数,直至到达末尾,再从尾部返回并打印字符; 否则就打印当前字符并返回。 DLR(x*root) 递归算法的一般形式: (殷人凯题集 P102) Invert(stringlistnode *p){ {if(!root)return(0); if(!p)return(0); void p(参数表){ printf(“%d”,root-&data); else Invert(p-&next); if (递归结束条件) DLR(root-&lchild); 可直接求解步骤; 基本项 DLR(root-&rchild); else p(较小的参数) ; 归纳项 } }22 23printf(“%c”, p-&data) } 如果当前串长为 0,则 return(-1) 否则开始递归: if 串没有到末尾,则 P=P-& 再调用 invert(s); else printf(p-&data); return 4.10 void String_Reverse(Stringtype s,Stringtype &r)//求 s 的逆串 r 求 { StrAssign(r,''); //初始化 r 为空串 初始化 for(i=Strlen(s);i;i--) { StrAssign(c,SubString(s,i,1)); StrAssign(r,Concat(r,c)); //把 s 的字符从后往前添加到 r 中 把 } }//String_Reverse/这是递推算法? 这是递推算法? 这是递推算法3. 【严题集 5.18⑤】试设计一个算法,将数组 An 中的元素 A[0]至 A[n-1]循环右移 k 位,并要求只用一个元素大小 试设计一个算法, 试设计一个算法 至 循环右移 的附加存储, 的附加存储,元素移动或交换次数为 O(n) 解:5.18 分析:要把 A 的元素循环右移 k 位,则 A[0]移至 A[k],A[k]移至 A[2k]......直到最终回到 A[ 0].然而这并没有全部解决问题, 因为有可能有的元素在此过程中始终没有被访问过,而是被跳了过去.分析可知,当 n 和 k 的最大公约数为 p 时,只要分别 以 A[0],A[1],...A[p-1]为起点执行上述算法,就可以保证每一个元素都被且仅被右移一次,从而满足题目要求.也就是说,A 的所有元素分别处在 p 个&循环链&上面.举例如下: n=15,k=6,则 p=3. 第一条链:A[0]-&A[6],A[6]-&A[12],A[12]-&A[3],A[3]-&A[9],A[9]-&A[0]. /已“顺便”移动了 A[6]、A[12]… 第二条链:A[1]-&A[7],A[7]-&A[13],A[13]-&A[4],A[4]-&A[10],A[10]-&A[1]. 第三条链:A[2]-&A[8],A[8]-&A[14],A[14]-&A[5],A[5]-&A[11],A[11]-&A[2]. 恰好使所有元素都右移一次. 虽然未经数学证明,但作者相信上述规律应该是正确的. 程序如下: void RSh(int A[n],int k)//把数组 A 的元素循环右移 k 位,只用一个辅助存储空间 { for(i=1;i&=k;i++) if(n%i==0&&k%i==0) p=i;//求 n 和 k 的最大公约数 p for(i=0;i&p;i++) { j=i;l=(i+k)%n;temp=A[i]; while(l!=i) { A[j]= temp=A[l]; A[l]=A[j]; j=l;l=(j+k)%n; }// 循环右移一步 A[i]= }//for }//RSh23 24附加题: 附加题: 利用 C 的库函数 strlen, strcpy(或 strncpy)写一个算法 void StrDelete(char *S,int t,int m) ,删除串 S 中从 ( ) 个字符。 ≥ 位置 i 开始的连续的 m 个字符。若 i≥strlen(S),则没有字符被删除;若 i+m≥strlen(S),则将 S 中从位置 i 开始直至 ,则没有字符被删除; ≥ , 末尾的字符均被删去。 末尾的字符均被删去。 提示: 是求串长(length)函数: (length)函数 //求串的长度 提示:strlen 是求串长(length)函数:int strlen(char s); //求串的长度 是串复制(copy)函数: (copy)函数 //该函数将串 strcpy 是串复制(copy)函数:char *strcpy(char to,char from); //该函数将串 from 复制到串 to 中,并且 返回一个指向串 to 的开始处的指针。 的开始处的指针。24 25第6章树和二叉树 自测卷解答题号 题分 得分 一 10 二 15 三 11姓名四 20 五 20班级六 24 总分 100一、下面是有关二叉树的叙述,请判断正误(每小题 1 分,共 10 分) 下面是有关二叉树的叙述,请判断正误()1. 若二叉树用二叉链表作存贮结构,则在 n 个结点的二叉树链表中只有 n―1 个非空指针域。 若二叉树用二叉链表作存贮结构, ― 个非空指针域。 )2.二叉树中每个结点的两棵子树的高度差等于 1。 二叉树中每个结点的两棵子树的高度差等于 。 )3.二叉树中每个结点的两棵子树是有序的。 二叉树中每个结点的两棵子树是有序的。 二叉树中每个结点的两棵子树是有序的 )4.二叉树中每个结点有两棵非空子树或有两棵空子树。 二叉树中每个结点有两棵非空子树或有两棵空子树。 二叉树中每个结点有两棵非空子树或有两棵空子树 )5.二叉树中每个结点的关键字值大于其左非空子树(若存在的话)所有结点的关键字值,且小于其右非空子 二叉树中每个结点的关键字值大于其左非空子树( 二叉树中每个结点的关键字值大于其左非空子树 若存在的话)所有结点的关键字值, 若存在的话)所有结点的关键字值。 树(若存在的话)所有结点的关键字值。 (应当是二叉排序树的特点) ( × )6.二叉树中所有结点个数是 2k-1-1,其中 k 是树的深度。 是树的深度。 二叉树中所有结点个数是 , ( × )7.二叉树中所有结点,如果不存在非空左子树,则不存在非空右子树。 二叉树中所有结点, 二叉树中所有结点 如果不存在非空左子树,则不存在非空右子树。 ( × )8.对于一棵非空二叉树,它的根结点作为第一层,则它的第 i 层上最多能有 2i―1 个结点。 对于一棵非空二叉树, 个结点。 (应 2i-1) 对于一棵非空二叉树 它的根结点作为第一层, ( √ )9.用二叉链表法(link-rlink)存储包含 n 个结点的二叉树,结点的 2n 个指针区域中有 n+1 个为空指针。 用二叉链表法( 个结点的二叉树, 个为空指针。 用二叉链表法 ) (正确。用二叉链表存储包含 n 个结点的二叉树,结点共有 2n 个链域。由于二叉树中,除根结点外,每一个结点有且 仅有一个双亲,所以只有 n-1 个结点的链域存放指向非空子女结点的指针,还有 n+1 个空指针。 )即有后继链接的指针 仅 n-1 个。 ( √ )10. 〖01 年计算机系研题〗具有 12 个结点的完全二叉树有 5 个度为 2 的结点。 最快方法:用叶子数=[n/2]=6,再求 n2=n0-1=5 ( ( ( ( ( √ × √ × ×二、填空(每空 1 分,共 15 分)1. 由3个结点所构成的二叉树有 . 5 种形态。 种形态。 个叶子。 2. 【计算机研 2000】 一棵深度为 6 的满二叉树有 n1=n2=2k-1-1=31 个分支结点和 26-1 =32 个叶子。 】 的结点,所以分支结点数就是二度结点数。 注:满二叉树没有度为 1 的结点,所以分支结点数就是二度结点数。 3. 一棵具有257个结点的完全二叉树,它的深度为 . 一棵具有257个结点的完全二叉树, 257个结点的完全二叉树 ( 注:用[log2n]+1(257≤2k-1) ( ≤ ) 9 。4. 【全国专升本统考题】设一棵完全二叉树有 700 个结点,则共有 350 个叶子结点。 答:最快方法:用叶子数=[n/2]=350 5. 设一棵完全二叉树具有 1000 个结点,则此完全二叉树有 500 个叶子结点,有 499 个度为 2 的结点,有 个结点, 个叶子结点, 的结点, 1 个结点只有非空左子树, 个结点只有非空右子树。 个结点只有非空左子树,有 0 个结点只有非空右子树。 答:最快方法:用叶子数=[n/2]=500 ,n2=n0-1=499。 另外,最后一结点为 2i 属于左叶子,右叶子是空的,所以有 1 个非空左子树。完全二叉树的特点决定不可能有左空右不空的情况,所以非空右子树数=0. 非空右子树数= 非空右子树数 6. 【严题集 6.7③】 一棵含有 n 个结点的 k 叉树,可能达到的最大深度为 n ,最小深度为 2 。 叉树, ③ 答:当 k=1(单叉树 时应该最深,深度=n(层) 当 k=n-1(k-1 叉树)时应该最浅,深度=2(层). 单叉树)时应该最深,深度= ( ;当 ; ( 叉树)时应该最浅,深度= ( 单叉树 时应该最深 (不可能只 1 层,那是只有根结点的情况。教材说是“完全 k 叉树” 指的是 k≥n 的情况。) 那是只有根结点的情况。教材说是“ 叉树” 不可能只 , ≥ 的情况。 7. 【96 程试题 1】 二叉树的基本组成部分是:根(N) 左子树(L)和右子树(R) 因而二叉树的遍历次序有六种。 、左子树 。因而二叉树的遍历次序有六种 】 二叉树的基本组成部分是: ) 左子树( )和右子树( ) 因而二叉树的遍历次序有六种。 、 。 最常用的是三种:前序法( 次序) 后序法( ,后序法 LR N 最常用的是三种:前序法(即按 N L R 次序) 后序法(即按 , 次序)和中序法(也称对称序法, 次序) 。这三种方法相互 次序)和中序法(也称对称序法,即按 L N R 次序) 这三种方法相互 。 之间有关联。若已知一棵二叉树的前序序列是 之间有关联。若已知一棵二叉树的前序序列是 BEFCGDH,中序序列是 ,25 26FEBGCHD,则它的后序序列必是 , FEGHDCB 。 ,由前序先确定 root,由中序先确定左边的叶子,再慢慢推导) ,由图知,后序序列 解:求 D 之法 1:画图(见右图) 为 FEGH……。 。 求 D 之法 2:其实不画图也能快速得出后序序列,只要找到根的位置特征。请看,前序遍历 BEFCGDH 中,根结 点在最前面, 一定在最后面。 点在最前面,是 B;则后序遍历中 B 一定在最后面。 ;小结: root, 小结:方法 1:由前序先确定 root,由中序先确定左子树递归计算。 在前序序列中第一,中序中在中间(可知左右子树上有哪些元素) 则在后序中必为最后。 ,则在后序中必为最后 方法 2:递归计算。如 B 在前序序列中第一,中序中在中间(可知左右子树上有哪些元素) 则在后序中必为最后。如法对 B 的左右子树 , 同样处理,则问题得解。 同样处理,则问题得解。8.【全国专升本统考题】中序遍历的递归算法平均空间复杂度为O(树的深度 k+1)或 O(n)。9. 【计算机研 2001】 用 5 个权值{3, 2, 4, 5, 1}构造的哈夫曼(Huffman)树的带权路径长度是 33 。 】 先构造哈夫曼树, =(4+ + ) +(1+ ) 解:先构造哈夫曼树,得到各叶子的路径长度之后便可求出 WPL=( +5+3)×2+( +2)×3=33 =( +( (15) (9) (6) 4 5 3 (3) 1 2 (注:原题为选择题:A.32 B.33 C.34 D.15)三、单项选择题(每小题 1 分,共 11 分) 单项选择题(( C )1. 不含任何结点的空树 . 。 (A)是一棵树 是一棵树; (A)是一棵树 (C)是一棵树也是一棵二叉树 是一棵树也是一棵二叉树; (C)是一棵树也是一棵二叉树 (B)是一棵二叉树 (B)是一棵二叉树; 是一棵二叉树 (D)既不是树也不是二叉树 (D)既不是树也不是二叉树( C )2.二叉树是非线性数据结构,所以 .二叉树是非线性数据结构, 。 (A)它不能用顺序存储结构存储 它不能用顺序存储结构存储; (B)它不能用链式存储结构存储 它不能用链式存储结构存储; (A)它不能用顺序存储结构存储 (B)它不能用链式存储结构存储 (C)顺序存储结构和链式存储结构都能存储 (D)顺序存储结构和链式存储结构都不能使用 顺序存储结构和链式存储结构都能存储; (C)顺序存储结构和链式存储结构都能存储 (D)顺序存储结构和链式存储结构都不能使用 ( A、C )3. 〖01 年计算机研题〗 具有 n(n&0)个结点的完全二叉树的深度为 。 (C) ? log2(n) ?+1 (D) ?log2(n)+1? (A) ?log2(n)? (B) ? log2(n)? 注:?x ?表示不小于 x 的最小整数;? x?表示不大于 x 的最大整数,它们与[ ]含义不同! ( A )4.把一棵树转换为二叉树后,这棵二叉树的形态是 .把一棵树转换为二叉树后, 。 (A)唯一的 (B)有多种 (A)}

我要回帖

更多关于 数据结构严蔚敏pdf下载 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信