⑴ 数据结构的问题 求步骤和思路
1 学习方法
因为要准备这个话题, 所以我认真的思考了我的学习方法, 但是我觉得基本上我就是上课前看看书、上课时认真听课、 下课以后复习复习、当然还有做作业时很认真的去做。根本谈不上什么好方法, 不过我还是有一些话要送给大家。
我能行!
个人觉得这句话非常重要,不知道大家是怎样看待数据结构这门课的, 有多少人觉得数据结构很难呢看我知道还是有一些同学这样觉得的, 有时候我跟我的朋友讲要怎样学,讲了一大堆以后, 他就向我抱怨:我以前c++都没有学好, 数据结构更学不好了, 这哪跟哪的话啊,数据结构与c++没有什么关系,我想假如抱有这样的心态, 自己就不相信自己, 那是不可能学好的, 然后那些觉得数据结构很难的同学, 我想他们应该会很看重数据结构的吧, 然后就一天到晚捧着一本数据结构, 这样不会觉得很累吗看而且因为觉得很难, 就容易不相信自己, 学的效率也不会很好, 个人认为数据结构很好学, 很容易学, 或许这有点妄自菲薄吧, 但是因为我觉得很容易, 当然就会觉得自己没问题, 学得很轻松, 效果也还可以。大家都是从高考走过来的, 应该知道心态的重要性吧, 两种不同的心态, 完全就是两种不同的效果。 学了这么久数据结构了, 我们到底在学些什么呢看 不知道大家有没有想过, 那现在我们现在来归纳一下我们学习的内容吧, 其实学到现在我们也就学了几种普通的数据结构, 象二叉树, 树, 图,还有排序的问题, 前面的线性表和字符串也就是一些概念, 当然还有一个很重要的KMP算法, 然后在每种数据结构中我们也就是学到了若干处理的算法, 我想真正数起来也就是几十个算法吧。 学习数据结构也就是要掌握这几十种算法, 多简单。至于如何掌握每个算法呢, 我想就是多看看书, 重要的是能够理解。
我能独自完成作业!
这里我的定义和老师的不同, 老师是鼓励大家讨论的, 不过我发现还是有一些同学就是先问好别人算法,然后再自己写, 虽然这个不算抄袭作业, 但自己基本上没有一个思考问题的过程, 虽然要理解算法也会要思考很多, 但是因为没有自己独立的思考过程, 要自己写程序、 写算法的时候根本写不出来, 所以我想如果真的想学好数据结构的话, 最好是能够自己思考问题, 不要刚想了一会就觉得做不出来, 然后就去问其他人。其实老师给我们的作业还是基于我们的水平的, 我绝对相信我们自己能够独自想出算法, 虽有可能会比较长时间吧, 但是这样肯定会比问其他人学到更多的东西。当然我并不是说不要问同学, 有时候就是脑筋转不过来,一问别人就懂了, 当然问了别人不能只是我知道了这个算法, 还应该去想如何思考才能得到这个算法,这样水平会提高很多。
多实验!
这个就没有太多理由了, 我一直觉得编程是一门熟练科学, 多编程,水平肯定会提高, 最重要的是能够养成一种感觉,就是对程序对算法的敏感, 为什么那些牛人看一个算法一下子就看懂了看而自己要看很久才能弄懂, 而且弄懂了过了一阵子又忘记了看其实这个是因为牛人们以前看的程序很多, 编得也很多, 所以他们有了那种感觉,所以我觉得大家应该多看程序, 多写程序, 培养自己的感觉。
2 复习和考试的技巧
我想大家应该都有这样的感觉,就是觉得自己什么都掌握了, 但是在考试的时候就是会犯晕, 有时候一出考场就知道错在哪个了, 然后考完以后一对答案,发现其实考得很简单, 应该都是自己会做的, 这个就是与自己的复习和考试的技巧有关系了。
首先就是复习, 前面已经说过其实我们学的算法也就是几十个, 那么我们的任务也就是理解这几十个算法, 复习也就是要加深你的理解。如何理解算法, 然后理解到什么程度呢看 是能默出整个算法吗看其实不是这样的, 数据结构的考试有它的特点, 考过期中考试了, 大家应该都发现数据结构其实不要求你把整个算法背出来, 它注重考察你的理解, 那么怎么考察呢看其实也就是两种方式吧, 一种就是用实例, 就是给你一个例子, 要你用某个算法运行出结果, 我想这个期末考试的时候仍然会有很多这样的题目, 比如排序那块就很好出这样的题目,要复习这种题目我觉得很简单,就是每个算法都自己用例子去实践一下, 以不变应万变,我期中复习的时候就是这样去做的, 而且考试之前我就觉得那个并查集的题目就很有可能会考, 于是就自己出了几个例子,做了一下。另外一种考察方式就是算法填空和算法改错, 可能有一些同学觉得这种题目很难, 其实我们首先可以确定这两种题目肯定是与书上算法有关系的, 只要理解了书上的算法就可以了,有人觉得看完书以后什么都懂了, 而且要默也默得出来, 其实不是这样的,算法改错和填空主要是考察的细微处, 虽然你觉得你默得出来, 那是能够默出算法的主体部分, 很多细微的地方你就会很容易忽略。我想大家考过期中考以后应该都有这种感觉吧看那要怎样解决这种问题呢看 我觉得有两种方法, 一种就是自己去编程实现, 这种方法比较有意义,还能够提高编程水平, 另外一种就是用实例分析算法的每句话, 我认为这种方法是最有效的。
然后还有一种题目, 就是最后的写算法的题目, 我觉得这种题目还是很好解决的, 只要是能够自己做出作业的, 基本上都会很容易做出来,这也是为什么我前面觉得平时做作业应该自己独立思考的原因,同时做这种题目千万要小心, 尤其是题目简单的时候, 那肯定会有一些小地方要考虑清楚,一不小心就会被扣掉很多分, 这样很不值。
我觉得考试的时候没有太多要讲的, 只要复习好了, 考试的时候细心一点就可以了, 然后就是做一个题目开始就要尽量保证正确,如果觉得留在那里等后面做完了再来检查,这样错误还是很有可能检查不出来, 我期中考试的时候就基本上没有检查, 因为我做每个题目都是确保正确, 用的时间也挺多的, 然后也觉得没有检查的必要了。
一个学生学习数据结构的体会(转)
读《数据结构(C语言版)》(1)
今天开始认真读这本清华版的数据结构,严蔚敏和吴伟民编着。也许你会奇怪我为什么会选择这本C语言描述的数据结构书,现在的数据结构不都用面向对象语言描述吗看其实这本书不是我选的,而是我参加的机试指定的参考书。不过对于本书选用的语言,我倒有自己的看法。用C语言描述显然有很多不便,但是在一个充斥着用OO描述数据结构的世界里,从OO中抽身出来用C看待数据结构的思想,也许更能看清数据结构的本质。
好了,言归正传。在今天这第一篇文章里,我来探讨一下数据结构的基本概念。作者一开篇就归纳了计算机解题的一般步骤:逗首先要从具体问题抽象出一个适当的数学模型,然后设计一个解此数学模型的算法,最后编出程序,进行测试、调试直至得到最终解答。地我把它再进一步归纳一下,就是:抽象数学模型——设计算法——编写程序。这个思路非常重要,除了一些非常简单的问题,所有的程序设计都应该遵循这三个基本步骤。我们平时写程序常犯的错误是忽略第一个或第二个步骤,或者更甚者,前两个都忽略。
在设计数学模型的过程中,实际上就引出了数据结构的概念。本书中作者给出的定义是:逗简单来说,数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等的学科。地国内的教材为了语言上的严谨常常把话说得很难懂。请大家注意这句话里的这几个关键词:1)非数值计算,这说明了数据结构这门学科的应用范围,如果你想解一个线性方程组,大概很难直接找到合适的数据结构;2)操作对象,也就是问题中的数据及其表示的形式;3)关系,即数据间的关系;4)操作,即针对数据的操作。
把以上的定义用公式写出来,就是
Data_Structure = (D, S)
其中D是数据元素的有限集,S是D上关系的有限集。所以在设计数据结构时,首要的任务就是找出要操作的数据,其次是挖掘出数据间的关系。这两步完成以后,数据的逻辑结构就定下来了。其中数据间的结构有以下几种:
集合,这和数学中的集合概念是一致的;
线性结构,即数据元素之间一对一的关系;
树形结构,即数据元素之间一对多的关系;
图状结构或网状结构,即数据元素之间多对多的关系。
然而只有逻辑结构是不够的,程序要能够运行,必须把数据的逻辑结构在计算机中表示出来,也就是设计物理结构。大多数高级语言都对数据的物理结构有较好支持,如各种数据类型。作者在解释数据类型的概念时说到:逗引入数据类型的目的,从硬件的角度看,是作为解释计算机内存中信息含义的一种手段,而对使用数据类型的用户来说,实现了信息的隐蔽,即将一切用户不必了解的细节都封装在类型中。地这个概括非常精辟,从中可以看出以后的OOP只是在更高层次上对信息的封装和隐蔽。
对数据类型进一步扩展,作者引出了抽象数据类型的概念。抽象数据类型(ADT)是指一个数学模型以及定义在该模型上的一组操作。在引入抽象数据类型后,使逻辑结构更加独立,从而让程序员可以更加专注于逻辑结构的设计。把抽象数据类型用公式表示出来,就是(D, S, P),其中D是数据对象,S是D上的关系集,P是对D的基本操作集。如果计算机解题一定要遵循一个通用的模式的话,上面这个式子就给出了答案。
读《数据结构(C语言版)》(2)
本节谈一谈算法分析和大O估算法(big-O notation)。算法效率的度量一般采用事前分析估算的方法,通常的做法是,逗从算法中选取一种对于所研究的问题(或算法类型)来说是基本操作的原操作,以该基本操作重复执行的次数作为算法的时间量度地。谈到这里时,作者引出了大O估算法。
在本书中,作者对大O估算法的介绍显得有些草率。一开始就冒出一个式子T(n) = O(n3),然后在本页最底下用小字介绍了所谓的逗"O"的形式定义地:若f(n)是正整数n的一个函数,则xn=O(f(n))表示存在一个正的常数M,使得当n≥n0时都满足|xn|≤M|f(n)|。也许是我数学基础太差,总之看到这个定义时我一头雾水。不知道为什么作者没有花一点篇幅介绍大O估算法的由来和定义。我google了一下,发现了这样的介绍:
Definition: A theoretical measure of the execution of an algorithm, usually the time or memory needed, given the problem size n, which is usually the number of items. Informally, saying some equation f(n) = O(g(n)) means it is less than some constant multiple of g(n). The notation is read, "f of n is big oh of g of n".
Formal Definition: f(n) = O(g(n)) means there are positive constants c and k, such that 0 ≤ f(n) ≤ cg(n) for all n ≥ k. The values of c and k must be fixed for the function f and must not depend on n.
Note: As an example, n2 + 3n + 4 is O(n2), since n2 + 3n + 4 < 2n2 for all n > 10. Strictly speaking, 3n + 4 is O(n2), too, but big-O notation is often misused to mean equal to rather than less than. The notion of "equal to" is expressed by Θ(n).
The importance of this measure can be seen in trying to decide whether an algorithm is adequate, but may just need a better implementation, or the algorithm will always be too slow on a big enough input. For instance, quicksort, which is O(n log n) on average, running on a small desktop computer can beat bubble sort, which is O(n2), running on a supercomputer if there are a lot of numbers to sort. To sort 1,000,000 numbers, the quicksort takes 20,000,000 steps on average, while the bubble sort takes 1,000,000,000,000 steps!
Any measure of execution must implicitly or explicitly refer to some computation model. Usually this is some notion of the limiting factor. For one problem or machine, the number of floating point multiplications may be the limiting factor, while for another, it may be the number of messages passed across a network. Other measures which may be important are compares, item moves, disk accesses, memory used, or elapsed ("wall clock") time.
(以上介绍来自:Paul E. Black, "big-O notation", from Dictionary of Algorithms and Data Structures, Paul E. Black, ed., NIST.)
另外,这个帖子也讨论了算法的时间复杂度估计,说得非常通俗易懂。
读《数据结构(C语言版)》(3)
【问题描述】
设计一个可进行复数运算的演示程序。
【基本要求】
实现下列六种基本运算:
由输入的实部和虚部生成一个复数;
两个复数求和;
两个复数求差;
两个复数求积;
从已知复数中分离出实部;
从已知复数中分离出虚部。
运算结果以相应的复数或实数的表示形式显示。
(全文见附件)
⑵ 数据结构与算法分析
本文出自:
www点54manong点com
请尊重原创,转载请注明出处,谢谢!
什么是数据结构,为什么要学习数据结构?数据结构是否是一门纯数学课程?它在专业课程体系中起什么样的作用?我们要怎么才能学好数据结构?… 相信同学们在刚开始《数据结构》这门课的学习时,心里有着类似前面几个问题的这样那样的疑问。希望下面的内容能帮助大家消除疑惑,下定决心坚持学好这门课:
1 学习数据数据结构的意义
数据结构是计算机科学与技术专业、计算机信息管理与应用专业,电子商务等专业的基础课,是十分重要的核心课程。所有的计算机系统软件和应用软件都要用到各种类型的数据结构。因此,要想更好地运用计算机来解决实际问题,仅掌握几种计算机程序设计语言是难以应付当前众多复杂的课题。要想有效地使用计算机、充分发挥计算机的性能,还必须学习和掌握好数据结构的有关知识。打好“数据结构”这门课程的扎实基础,对于学习计算机专业的其他课程,如操作系统、数据库管理系统、软件工程、编译原理、人工智能、图视学等都是十分有益的。
2 为什么要学习数据结构
在计算机发展的初期,人们使用计算机的目的主要是处理数值计算问题。当我们使用计算机来解决一个具体问题时,一般需要经过下列几个步骤:首先要从该具体问题抽象出一个适当的数学模型,然后设计或选择一个解此数学模型的算法,最后编出程序进行调试、测试,直至得到最终的解答。例如,求解梁架结构中应力的数学模型的线性方程组,可以使用迭代算法来求解。
由于当时所涉及的运算对象是简单的整型、实型或布尔类型数据,所以程序设计者的主要精力是集中于程序设计的技巧上,而无须重视数据结构。随着计算机应用领域的扩大和软、硬件的发展,非数值计算问题越来越显得重要。据统计,当今处理非数值计算性问题占用了85%以上的机器时间。这类问题涉及到的数据结构更为复杂,数据元素之间的相互关系一般无法用数学方程式加以描述。因此,解决这类问题的关键不再是数学分析和计算方法,而是要设计出合适的数据结构,才能有效地解决问题。下面所列举的就是属于这一类的具体问题。
例1:图书馆信息检索系统。当我们根据书名查找某本书有关情况的时候;或者根据作者或某个出版社查找有关书籍的时候,或根据书刊号查找作者和出版社等有关情况的时候,只要我们建立了相关的数据结构,按照某种算法编写了相关程序,就可以实现计算机自动检索。由此,可以在图书馆信息检索系统中建立一张按书刊号顺序排列的图书信息表和分别按作者、书名、出版社顺序排列的索引表,如图1.1所示。由这四张表构成的文件便是图书信息检索的数学模型,计算机的主要操作便是按照某个特定要求(如给定书名)对图书馆藏书信息文件进行查询。
诸如此类的还有学生信息查询系统、商场商品管理系统、仓库物资管理系统等。在这类文档管理的数学模型中,计算机处理的对象之间通常存在着的是一种简单的线性关系,这类数学模型可称为线性的数据结构。
例2:八皇后问题。在八皇后问题中,处理过程不是根据某种确定的计算法则,而是利用试探和回溯的探索技术求解。为了求得合理布局,在计算机中要存储布局的当前状态。从最初的布局状态开始,一步步地进行试探,每试探一步形成一个新的状态,整个试探过程形成了一棵隐含的状态树。如图1.2所示(为了描述方便,将八皇后问题简化为四皇后问题)。回溯法求解过程实质上就是一个遍历状态树的过程。在这个问题中所出现的树也是一种数据结构,它可以应用在许多非数值计算的问题中。
例3:教学计划编排问题。一个教学计划包含许多课程,在教学计划包含的许多课程之间,有些必须按规定的先后次序进行,有些则没有次序要求。即有些课程之间有先修和后续的关系,有些课程可以任意安排次序。这种各个课程之间的次序关系可用一个称作图的数据结构来表示,如图1.3所示。有向图中的每个顶点表示一门课程,如果从顶点vi到vj之间存在有向边<vi,vj>,则表示课程i必须先于课程j进行。由以上三个例子可见,描述这类非数值计算问题的数学模型不再是数学方程,而是诸如线性表、树、图之类的数据结构。因此,可以说数据结构课程主要是研究非数值计算的程序设计问题中所出现的计算机操作对象以及它们之间的关系和操作的学科。
学习数据结构的目的是为了了解计算机处理对象的特性,将实际问题中所涉及的处理对象在计算机中表示出来并对它们进行处理。与此同时,通过算法训练来提高学生的思维能力,通过程序设计的技能训练来促进学生的综合应用能力和专业素质的提高。
3数据结构课程的内容
数据结构与数学、计算机硬件和软件有十分密切的关系,它是介于数学、计算机硬件和计算机软件之间的一门计算机专业的核心课程,是高级程序设计语言、操作系统、编译原理、数据库、人工智能、图视学等课程的基础。同时,数据结构技术也广泛应用于信息科学、系统工程、应用数学以及各种工程技术领域。
数据结构课程重在讨论软件开发过程中的方案设计阶段、同时设计编码和分析阶段的若干基本问题。此外,为了构造出好的数据结构及其实现,还需考虑数据结构及其实现的评价与选择。因此,数据结构的内容包括三个层次的五个“要素”,如图1.3所示。
数据结构的核心技术是分解与抽象。通过分解可以划分出数据的三个层次;再通过抽象,舍弃数据元素的具体内容,就得到逻辑结构。类似地,通过分解将处理要求划分成各种功能,再通过抽象舍弃实现细节,就得到运算的定义。上述两个方面的结合使我们将问题变换为数据结构。这是一个从具体(即具体问题)到抽象(即数据结构)的过程。然后,通过增加对实现细节的考虑进一步得到存储结构和实现运算,从而完成设计任务。这是一个从抽象(即数据结构)到具体(即具体实现)的过程。熟练地掌握这两个过程是数据结构课程在专业技能培养方面的基本目标。
结束语:数据结构作为一门独立的课程在国外是从1968年才开始的,但在此之前其有关内容已散见于编译原理及操作系统之中。20世纪60年代中期,美国的一些大学开始设立有关课程,但当时的课程名称并不叫数据结构。1968年美国唐.欧.克努特教授开创了数据结构的最初体系,他所着的《计算机程序设计技巧》第一卷《基本算法》是第一本较系统地阐述数据的逻辑结构和存储结构及其操作的着作。从20世纪60年代末到70年代初,出现了大型程序,软件也相对独立,结构程序设计成为程序设计方法学的主要内容,人们越来越重视数据结构。从70年代中期到80年代,各种版本的数据结构着作相继出现。目前,数据结构的发展并未终结,一方面,面向各专门领域中特殊问题的数据结构得到研究和发展,如多维图形数据结构等;另一方面,从抽象数据类型和面向对象的观点来讨论数据结构已成为一种新的趋势,越来越被人们所重视。
⑶ 几个数据结构的题目,成绩分析问题。谢谢
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedefstructstudent{
unsignednum;//学号
charname[20];
doublescore[5];//[0]:数学,[1]:英语,[2]:计算机,[3]:平均成绩,[4]:总成绩
structstudent*next;
}*LinkList,*pNode,Node;
LinkListgetEmptyList(){
LinkListhead=(pNode)malloc(sizeof(Node));
head->num=0;
head->name[0]=0;
head->next=0;
returnhead;
}
intinsertNode(LinkListhead,Nodenode){
pNodep=head;
pNodenewnode=(pNode)malloc(sizeof(Node));
*newnode=node;
while(p->next){
if(p->next->num==node.num){
printf("重复的学号:%u,操作失败! ",node.num);
free(newnode);
return0;
}
if(p->next->num>node.num){
newnode->next=p->next;
p->next=newnode;
return1;
}
elsep=p->next;
}
p->next=newnode;
newnode->next=0;
return1;
}
intmysort(LinkListhead,intindex){
pNodep,pt,q,qt;
if(index<0||index>4){
printf("0:按数学成绩排序。 ");
printf("1:按英语成绩排序。 ");
printf("2:按计算机成绩排序。 ");
printf("3:按平均成绩排序。 ");
printf("4:按总成绩排序。 ");
return0;
}
for(p=head;p->next;p=p->next){
qt=p;
q=p->next;
while(q->next){
if(qt->next->score[index]<q->next->score[index])
qt=q;
q=q->next;
}
if(p!=qt){
pt=p->next;
p->next=qt->next;
qt->next=p->next->next;
p->next->next=pt;
}
}
return1;
}
voidshow(LinkListhead){
inti;
pNodep=head->next;
while(p){
printf("%u ",p->num);
printf("%s ",p->name);
for(i=0;i<5;++i)
printf("%.2lf ",p->score[i]);
printf(" ");
p=p->next;
}
}
intstatist(LinkListhead,intindex){
intscore0_59=0,score60_69=0;
intscore70_79=0,score80_89=0;
intscore90_100=0,n=0;
doublet,max=0,min=100,total=0;
pNodep=head->next;
if(index<0||index>3){
printf("0:统计数学成绩。 ");
printf("1:统计英语成绩。 ");
printf("2:统计计算机成绩。 ");
printf("3:统计平均成绩。 ");
return0;
}
while(p){
t=p->score[index];
if(t>=90)++score90_100;
elseif(t>=80)++score80_89;
elseif(t>=70)++score70_79;
elseif(t>=60)++score60_69;
else++score0_59;
if(t>max)max=t;
if(t<min)min=t;
total+=t;
++n;
p=p->next;
}
if(score0_59)printf("0--59:%d ",score0_59);
if(score60_69)printf("60--69:%d ",score60_69);
if(score70_79)printf("70--79:%d ",score70_79);
if(score80_89)printf("80--89:%d ",score80_89);
if(score90_100)printf("90--100:%d ",score90_100);
if(n)printf("平均成绩:%.2lf ",total/n);
return1;
}
voidreadFile(LinkListhead,charfilename[]){
inti;
Nodenode;
FILE*infp=fopen(filename,"rt");
if(infp==NULL){
printf("打开文件%s时失败! ",filename);
return;
}
while(fscanf(infp,"%u%s%",&node.num,node.name)==2){
node.score[4]=0;
for(i=0;i<3;++i){
fscanf(infp,"%lf",&node.score[i]);
node.score[4]+=node.score[i];
}
node.score[3]=node.score[4]/3;
insertNode(head,node);
}
fflush(infp);
fclose(infp);
}
voidwriteFile(LinkListhead,charfilename[]){
inti;
pNodep=head->next;
FILE*outfp=fopen(filename,"wt");
if(outfp==NULL){
printf("打开文件%s时失败! ",filename);
return;
}
while(p){
fprintf(outfp,"%u%s",p->num,p->name);
for(i=0;i<5;++i)
fprintf(outfp,".2lf",p->score[i]);
fprintf(outfp," ");
p=p->next;
}
fclose(outfp);
}
voidinputData(LinkListhead){
inti;
Nodenode;
printf("学号姓名英语数学计算机: ");
scanf("%u%s",&node.num,node.name);
node.score[4]=0;
for(i=0;i<3;++i){
scanf("%lf",&node.score[i]);
node.score[4]+=node.score[i];
}
node.score[3]=node.score[4]/3;
insertNode(head,node);
}
intmain(){
charinFilename[]="input.dat";
charoutFile[][60]={"outFileMath.dat","outFileEnglish.dat",
"outFileComputer.dat","outFileAverage.dat","outFileTotal.dat"};
charcommand[20];
intop,index,save;
LinkListhead=getEmptyList();
do{
printf("********************************* ");
printf("*考试成绩分析系统* ");
printf("********************************* ");
printf("*1、输入信息* ");
printf("*2、显示信息* ");
printf("*3、按课程成绩排序* ");
printf("*4、信息分析* ");
printf("*5、读数据文件* ");
printf("** ");
printf("*0、推出分析系统* ");
printf("********************************* ");
printf(" 请选择:");
fgets(command,20,stdin);
fflush(stdin);
op=command[0]-'0';
switch(op){
case1:inputData(head);break;
case2:show(head);break;
case3:
printf("0:按数学成绩排序 ");
printf("1:按英语成绩排序 ");
printf("2:按计算机成绩排序 ");
printf("3:按平均成绩排序 ");
printf("4:按总成绩排序 ");
printf(" 请输入相应编号:");
scanf("%d",&index);
fflush(stdin);
mysort(head,index);
printf("排序完毕,存盘否(1存,0不存):");
scanf("%d",&save);
fflush(stdin);
if(save==1)writeFile(head,outFile[index]);
break;
case4:
printf("0:数学成绩分析 ");
printf("1:英语成绩分析 ");
printf("2:计算机成绩分析 ");
printf("3:平均成绩分析 ");
printf("请输入相应编号:");
scanf("%d",&index);
fflush(stdin);
mysort(head,index);
statist(head,index);
break;
case5:readFile(head,inFilename);break;
case0:break;
default:printf("错误的选择。 ");break;
}
}while(op);
printf("END!!!! ");
return0;
}
⑷ 计算机考研:数据结构常用算法解析(2)
数据结构是计算机考研408计算机学科专业基础综合的重要组成部分,考生需要认真复习,尤其是对于数据结构中一些常用的算法问题,考生一定要弄懂弄会,理解的去掌握。猎考考研就带大家一一梳理这些知识点。
第二章
循环链表是一种首尾相接的链表。也就是终端结点的指针域不是指向NULL空而是指向开始结点(也可设置一个头结点),形成一个环。采用循环链表在实用中多采用尾指针表示单循环链表。这样做的好处是查找头指针和尾指针的时间都是O(1),不用遍历整个链表了。
判别链表终止的条件也不同于单链表,它是以指针是否等于某一指定指针如头指针或尾指针来确定。
何时选用顺序表、何时选用链表作为线性表的存储结构为宜?
答:
在实际应用中,应根据具体问题的要求和性质来选择顺序表或链表作为线性表的存储结构,通常有以下几方面的考虑:
1.基于空间的考虑。当要求存储的线性表长度变化不大,易于事先确定其大小时,为了节约存储空间,宜采用顺序表;反之,当线性表长度变化大,难以估计其存储规模时,采用动态链表作为存储结构为好。
2.基于时间的考虑。若线性表的操作主要是进行查找,很少做插入和删除操作时,采用顺序表做存储结构为宜;反之, 若需要对线性表进行频繁地插入或删除等的操作时,宜采用链表做存储结构。并且,若链表的插入和删除主要发生在表的首尾两端,则采用尾指针表示的单循环链表为宜。
第2章节有关数据结构算法,上文中为大家作了分析,希望考生对于这些算法能够熟记于心,方便考试的应用和日后的实际操作,预祝大家都能够取得好成绩,加油!
更多详情请点击:计算机考研:数据结构常用算法解析汇总
考研有疑问、不知道如何总结考研考点内容、不清楚考研报名当地政策,点击底部咨询官网,免费领取复习资料:https://www.87dh.com/xl/
⑸ 数据结构课程设计--学生成绩管理系统C语言
一、需求分析
1. 系统菜单的主要功能
(1)输入若干条记录
(2)查找并修改记录
(3)查找并删除记录
(4)成绩排序
(5)查找并显示一条记录
(6)将数据载入内存中
(7)将所有数据写入文件中
(0)退出程序
2. 功能分析
功能1为输入一条记录到结构体中去。
功能2、3和5算法相似,都是先查找成绩,2、3在此基础上再对查找出的信息进行操作。因为学生姓名定义成了字符数组的形式,因此在运用选择法进行排序的时候,要用到strcmp,strcpy等函数
功能4为成绩排序,可按学生学号排序或某单科成绩或总分排序,并输出相关的学生信息等。
功能6和7是对文件的操作,提前准备好数据。
二、总体设计
“学生成绩管理系统”包括:成绩录入、修改、删除、成绩统计和信息保存、载入这几个模块。
1、 主函数 main()
利用无限次循环while(1)和swithch()实现各函数的调用,系统根据输入的数字选项来调用相应的函数。
2、 菜单选择函数showmenu ();
这是一个无参函数,主要实现“功能选择”的界面,在这个界面里有显示系统的各项功能选单,根据每个功能前面的序号进行选择。等执行完每一个函数功能后,按任一键回到主界面也要通过这个函数来实现!3、 输入记录函数addstudent (stu *s) 这是一个带参函数,用来执行第学生成绩记录的输入,当学生为0时停止输入。
算法:利用函数参数s,并将s->next设为NULL。每输入一个数据就声明一个新节点p,把p->next设为NULL,并且链接到之前列表的尾端。4、 显示记录函数showstudent (stu *s) 这是一个不返回值的有参函数,形参为“链表头的指针”,负责对全部学生成绩记录的输出,不足之处就是不能对学生成绩进行分页显示。 算法:先将p结点的指针指向第一个结点,将p结点(即第一个结点)的数据输出。然后再将p结点的指针指向p指针的的指针(即下一结点),将p结点(即第一结点)的数据输出。重复执行此步聚直到p指针指向NULL为止。5、 查找记录函数findstudent (stu *s) 这是一个不返回值的有参函数,形参为“链表头的指针”,实现按学号对某个学生进行查找,并显示所查找到的记录。 算法:采用线性查找法往下一个节点查找。输入所要查找的学生的学号s,设一个指针变量p,先指向第一个结点,当strcmp(p->name,s) && p != NULL时,使p后移一个结点,如果p!=NULL,输出p所指的结点。6、 删除记录函数delstudent (stu *s) 这是一个有参函数,形参为“链表头的指针”,先输入要删除的学生记录的学号,找到后显示该学生信息,等确认后便可按“Y”进行删除。 算法:从p指向的第一个结点开始,检查该结点中的num值是否等于输入的要求删除的那个学号。如果相等就将该结点删除,如不相等,就将p后移一个结点,再如此进行下去,直到遇到表尾为止。7、保存数据到文件函数savestudent (stu *s) 这是一个不返回值的有参函数,形参为“链表头的指针”,可以把学生记录保存在电脑上由自己任意命名的二进制文件。8、从文件读数据函数loadstudent (stu *s) 这是一个不返回值的有参函数,形参为“链表头的指针”,根据输入的文件地址进行读取。
三、程序流程图
1)成绩统计:
2)信息录入:
3)信息修改:
4)信息删除:
4)信息查询:
4)信息保存:5)主函数:
四、程序调试及体会
1)程序演示:
2)程序调试:
(1)刚开始没有那个初始化函数,程序运行后,没有输入任何数据就试得去执行显示功能,结果显示的是一些乱码!加入初始化函数后,这种现象也随之消失。
(2)刚开始执行输入函数,按学号顺序输入十个学生的成绩,输完后执行显示功能,学生成绩记录是按学号的反顺序显示的,试着在其中增加一些语句,希望能把学号按正常顺序显示,但暂时没有成功,所以在输入成绩时只能按学号反顺序输入,最后就按学号正常顺序输出了。
(3)刚开始时,先把成绩按平均分排序,再插入一个学生的成绩,执行显示功能,虽然插入的学生的成绩能正常插入,但该学生的名次为0。后来,在插入成绩之后,调用排序函数,把所有成绩重新排序一次。
(4)在输入函数中设了一个无限循环,可以输入无数个学生的成绩信息,当学号为0的时候则停止输入。
(5)输入太多个学生的成绩时,屏幕显示不能控制为一页一页显示,所以为了方便起见,不要输入太多记录,十七左右为最佳。
(6)在没有输入任何信息的情况下,去执行排序功能,最后显示有一个记录,学号、姓名为空白,成绩都为0,名次为1。
(7)在输入选项时不能输入字母,否则会死循环,建议不要乱输字母。
3)心得体会:
经过一个星期的课程设计,感觉自己收获不少!
首先是:链表是数据结构的基本体现,所以这个课程设计里面主要都是用链表,而已要达到这样的功能,使用链表相当方便,但不容易理解,所以在这方面我很了很多的时间看课本和参考课外书,使C语言的知识强化了不少。
其次,在做课程设计的过程中,发现了平时很多没有注意到的问题,例如:返回值函数和不返回值函数两者在主函数中的调用是不同的…………
更重要的是,这次课程设计虽然花了我不少时间,但正是这些时间,让我见识到了要学好C语言,数据的处理是相当重要的。这个学生成绩管理系统都是在自己知识范围内完成的,所以界面清晰简单,可能不是很好看,但绝对实用!
从这里我也得到一个体会,做一个程序,或者开发一个软件,应该着重从它的后台制作入手,不能做出一个中看不中用的程序或者软件。
相信这次的课程设计为我以后继续从事计算机工作打了一个小小的开头。
参考书目;
[1]谭浩强. C程序设计(第三版) . 北京:清华大学出版社, 2006
[2]谭浩强. C程序设计上机指导(第三版) . 北京:清华大学出版社, 2005
[3]严蔚敏、吴伟民. 数据结构(C语言版) . 北京:清华大学出版社, 2006
计算机科学与技术系课程设计评分表