2013年算法与数据结构文档.doc
算法与数据结构

算法与数据结构1.引言本文档旨在介绍算法与数据结构的基本概念、常见算法和数据结构的实现方式,并提供相关的示例代码。
通过阅读本文档,读者将能够理解和应用算法与数据结构的基本原理,提高编程效率和代码质量。
2.算法基础2.1 算法定义●算法的概念和特性●算法复杂度分析方法2.2 常用算法设计策略●贪心算法●动态规划●分治法●回溯法3.数据结构3.1 线性数据结构3.1.1 数组3.1.2 链表3.1.3 栈3.1.4 队列3.2 非线性数据结构3.2.1 树●二叉树●平衡二叉树●堆●字典树3.2.2 图●图的表示方法●图的遍历算法●最短路径算法●最小树算法4.常见算法4.1 查找算法●顺序查找●二分查找●哈希查找4.2 排序算法●冒泡排序●插入排序●归并排序●快速排序4.3 字符串匹配算法●暴力匹配算法●KMP算法●Boyer-Moore算法5.示例代码5.1 示例1:________ 使用二分查找算法在有序数组中查找指定元素5.2 示例2:________ 使用快速排序算法对数组进行排序(更多示例代码详见附件)6.附件本文档附件中包含了相关的代码示例,可供读者参考并用于实践。
7.法律名词及注释在本文档中用到的法律名词及注释如下:________●算法:________根据一定的输入规则和运算规则,以明确的步骤得到输出结果的操作集合。
●数据结构:________是一种组织和管理数据的方式,使得数据可以高效地进行存储、检索和操作。
8.结束语本文档介绍了算法与数据结构的基本概念、常见算法和数据结构的实现方式,并提供了示例代码供读者参考。
通过学习本文档,读者将能够掌握算法与数据结构的基本原理,提高编程效率和代码质量。
《数据结构与算法》实验指导书2013版

《数据结构与算法》实验指导书大连民族学院信息与通信工程学院2013 年10 月10 日基本要求1.学生必须按时到实验室做实验,不得迟到早退,未经老师批准不得中途离开。
凡迟到者,应给予批评并作适当扣分。
实验课迟到20分钟以上及无故缺席者视为旷课,旷课者不予补做实验,本次实验以零分计。
学生因病或特殊情况不能按时到实验室做实验时,应办理正常请假手续。
请病假必须有医生签字的病假条,请事假必须有班主任签字的事假条。
不符合请假手续的,以旷课论处。
请假的学生由指导教师安排补做实验。
对于未做实验数达三分之一以上(含三分之一)的学生,实验课程按0分计。
2.学生在每次实验课之前,应仔细阅读实验教材,查阅相关的资料,写出预习报告。
预习报告的具体内容包括:实验内容、实验目的、实验原理图、实验步骤、实验数据记录表格等。
实验课前由任课教师检查预习报告,未写预习报告者不予做实验。
3.做实验前,了解设备的原理和正确使用方法。
在没有弄懂仪器设备的使用方法前,不得贸然使用,否则因使用不当造成仪器设备损坏的,根据大连民族学院《仪器设备损坏丢失处理暂行办法》规定进行处理。
实验室内设备在实验过程中不准任意搬动和调换,非本次实验所用仪器设备,未经指导教师允许不得动用。
4.要求每位学生在实验过程中,要具有严谨的学习态度、认真、踏实、一丝不苟的科学作风。
实验过程中学生按照预习的内容进行实验,且重视实验的调试过程,学会如何根据实验现象判断问题所在。
坚持每次实验都要亲自动手,不可“坐车”,每个实验每个学生都要独立完成,不允许抄袭,无特殊原因,中途不得退出实验,否则本次实验无效。
5.实验中若接线、改接、拆线都必须在切断电源的情况下进行,线路连接完毕再送电。
实验中,特别是设备刚投入运行时,要随时注意仪器设备的运行情况,如发现有过热、异味、冒烟、火花等,应立即断电,并请指导老师检查、处理。
6.实验过程中,如出现事故,就马上拉开电源开关,然后找指导教师和实验技术人员,如实反映事故情况,并分析原因和处理事故。
《数据结构与算法》

《数据结构与算法》数据结构与算法随着信息时代的快速发展,计算机科学技术的应用范围越来越广泛,数据结构和算法也成为了热门话题,日益受到关注。
在计算机科学中,数据结构和算法是两个非常重要的概念,它们互相依存,彼此支持。
本篇文章将从数据结构和算法的定义、基本类型、算法复杂度等方面进行详细介绍,帮助大家更全面地了解这两个重要的概念。
一、数据结构的定义及基本类型数据结构是计算机中存储、组织数据的方式,它的基本目的是高效地访问和修改数据。
数据结构可以分为两类:线性结构和非线性结构。
线性结构是指数据元素之间存在一对一,或一对多的相邻关系。
其基本特征是元素之间仅存在两个关系,即前驱和后继关系。
线性结构常见的有数组、链表、队列和栈四种基本形式。
非线性结构则是指数据元素之间存在一对多或多对多的关系,这种结构用图来表示最为合适。
非线性结构常见的有树、图和集合等。
对于任何数据结构,它都应该具有以下几个方面特征:1.操作集:数据集上的基本运算,如查找、插入、删除等。
2.存储空间:存储数据元素的空间。
3.数据元素之间的关系:数据元素之间相互关联的方式,如互为兄弟关系、互为父子关系。
4.逻辑结构:数据元素之间的逻辑关系:如一对一,一对多,多对多等。
二、算法的定义及主要类型算法是计算机解决问题的一种方法,它通常由一系列指令组成,以完成特定任务的过程。
算法分为以下几种主要类型:1.搜索算法:搜索算法采用穷举法来查找问题的最优解。
其核心是逐步深入,每次逐步扩大搜索规模来查找问题的解。
例如,深度优先搜索和广度优先搜索等。
2.排序算法:排序算法是指将无序的数据进行排列,使其按照一定顺序排列。
其实现原理是采用不同的比较方法和排序策略。
例如,插入排序、快速排序、归并排序等。
3.图论算法:图论算法是指在带权或无权图中,解决最短路径、最小生成树、网络流等问题的算法。
例如,Dijkstra算法、Prim算法、Kruskal算法等。
4.动态规划算法:动态规划算法是指先求出子问题的解,然后通过组合子问题的解得到原问题的解。
算法与数据结构课设(有向图,无向图,有向网,无向网)

算法与数据结构课程设计报告系(院):计算机科学学院专业班级:教技1001姓名:李##学号: ******### 指导教师:***设计时间:2012.6.16 - 2012.6.24设计地点:4号楼2号机房目录一、设计方案 (1)二、实现过程以及代码 (2)三、测试 (20)四、结论和分析 (23)五、难点和收获 (23)一、 设计方案1.程序设计基本过程:拿到课程设计任务书,按照要求,需要设计有向图、有向网、无向图 、无向网四种图,以及邻接矩阵、邻接表两种数据存储结构,三层以上的显示菜单。
图的操作中又包含了有关线性表、栈和队列的基本操作。
由于显示菜单已给出,剩下的任务就是把函数写入其中。
2.程序流程图:预定义 定义结构体 定义变量 各种函数3.程序设计的原理:图的操作都是以两种存储结构为基础的:邻接矩阵存储结构和邻接表存储结构,如有向图,有向网,无向图,无向网的创建,其他的操作都是在四种图创建后才开始进行的。
所以,首先必须理解两种存储结构的定义。
图的邻接矩阵存储结构即图的数组表示法。
用两个数组分别存储数据元素(如顶点)的信息和数据元素之间的关系(如边或弧)的信息。
用邻接矩阵存储结构的图具有以下几点特征:(一):顶点数:vexnum ,边(弧)数:arcnum ,图的种类:kind ;(二):邻接矩阵:arcs(1顶点关系类型:adj 2相关信息:*info);(三):顶点向量(顶点名):vexs[];其优点是以二维数组表示有n 个顶点的图时,需存放n 个顶点的信息和n*n 条弧的信息存储量。
借助邻接矩阵容易判定任意两个顶点之间是否有边或弧相连,并容易求出各个顶点的度。
缺点是时间复杂度是O (n*n ),例如,构造一个具有n 个顶点和e 条边的无向网的时间复杂度为O (n*n+e*n )。
图的邻接表存储结构是图的一种链式存储结构。
对图中的每个顶点建立一个单链表,每个结点由三个域组成,邻接点域adjvex (弧尾在邻接表链表中的位序),链域nextarc (下一条弧),数据域info(权值)。
C语言算法与数据结构常用算法和数据结构

C语言算法与数据结构常用算法和数据结构C语言作为一门广泛应用于软件开发领域的编程语言,对于掌握算法和数据结构的知识非常重要。
掌握常用的算法和数据结构,不仅可以帮助我们解决实际问题,还能提高代码的效率和质量。
本文将介绍C语言中常见的算法和数据结构。
一、算法1. 排序算法(1)冒泡排序:通过不断比较相邻元素并交换位置,将最大(或最小)元素逐步冒泡到最后的位置。
(2)插入排序:将一个元素插入到已排序部分的正确位置,逐步构建有序序列。
(3)快速排序:通过选择一个基准元素,将数据分为两部分,一部分小于基准,一部分大于基准,然后递归地对两部分进行排序。
(4)归并排序:将待排序序列递归地分成两个子序列,然后将两个有序子序列合并成一个有序序列。
2. 查找算法(1)线性查找:逐个比较每个元素,直到找到目标元素或搜索结束。
(2)二分查找:在有序序列中,通过比较目标值与中间元素的大小关系,将查找范围缩小一半,直到找到目标元素或搜索结束。
(3)哈希查找:通过哈希函数计算目标元素在数组中的位置,快速定位目标元素。
二、数据结构1. 数组数组是一种线性数据结构,可以存储多个相同类型的元素。
通过索引可以快速访问数组中的元素,但插入和删除元素的操作较为复杂。
2. 链表链表是一种动态数据结构,可以在运行时分配内存。
每个节点存储数据和指向下一个节点的指针,可以方便地进行插入和删除节点的操作,但访问节点需要遍历链表。
3. 栈栈是一种先进后出(LIFO)的数据结构,只能在栈顶进行插入和删除操作。
常用于表达式求值、递归函数调用等场景。
4. 队列队列是一种先进先出(FIFO)的数据结构,可以在队尾插入元素,在队头删除元素。
常用于任务调度、缓冲区管理等场景。
5. 树树是一种非线性数据结构,由节点和边组成。
常见的树结构包括二叉树、二叉搜索树、平衡二叉树等。
6. 图图是一种包含节点和边的非线性数据结构,用于表示多对多的关系。
常见的图结构包括有向图、无向图、加权图等。
数据结构与算法

数据结构与算法数据结构和算法是计算机科学中最基本的两个概念之一。
它们是计算机科学的核心,并影响着信息技术的发展进程。
数据结构是存储和组织数据的方法。
算法是解决问题的方法。
数据结构和算法是两个紧密相关的概念,因为在编写程序时,必须考虑数据的组织和我们如何处理数据以得到正确的结果。
数据结构和算法是程序员必须掌握的基本概念。
在编写程序时,我们通常要使用一些数据类型,比如整数、浮点数、字符串、数组和列表等。
这些数据类型都有它们自己的特点和限制。
我们要根据问题的需要,选择合适的数据类型,并将它们组织成数据结构,以便利用它们来解决问题。
而算法,则是用来处理和操作这些数据结构的方法。
数据结构和算法的重要性数据结构和算法是计算机科学中极为重要的概念。
在编写程序时,我们必须考虑使用合适的数据结构和算法来解决问题。
如果我们选择了不合适的数据结构,或是没有正确地实现算法,那么程序可能会运行缓慢或者产生错误。
因此,掌握数据结构和算法可以帮助程序员更有效地编写程序,从而提高程序的性能和准确性。
数据结构和算法的种类数据结构和算法各有多种类型。
以下是几种常用的数据结构和算法:数组(Array):数组是一组相同类型的数据,通过下标访问数组中的元素。
在编写程序时,数组是最常用的数据结构之一。
链表(LinkedList):链表是一组通过指针(引用)相连的节点集合。
每个节点包含一个值和一个指向下一个节点的指针。
堆(heap):堆是一种完全二叉树,它满足一定的堆性质。
堆常用于实现优先队列和排序。
树(Tree):树是一种数据结构,它由若干个节点和边组成。
每个节点有零个或多个子节点,最顶层的节点称为根节点。
哈希表(HashTable):哈希表是一种数据结构,它可以在 O(1)时间内查找和修改数据。
二分查找(Binary Search):二分查找是一种查找算法,它通过递归或迭代的方式在有序数组中查找指定元素。
快速排序(Quick Sort):快速排序是一种排序算法,它采用分治思想,将原始数据分成较小的、更易排序的子序列,再对子序列进行排序,最终得到有序序列。
数据结构与算法 (2)

First started programming : have no ADT
–Writing the same code over and over
Data Sagtrauincture can be defined as:Exa•mAtpolemfiocr DADatTa: tahreecsoidneglteo arenadd the 1ea.Ak♠stcheWehcayAtebotoon•adohcmkAfAdwsoaafoanwtebrntwndinoadoatc-ihwha,ndmaiblsttatfiyetbauewcaihirspcstncahtheipaeotcdotaordeintimooaotniscforadnpcanofpnatoeotentaosdtprhidfriostmasaaetaheiatmystcahetlibopatokeidisrtlpcaenymedtatpogyeswedieepnesrdntaonanedhcadtttthaaapiiitesttsoneotayafai.ngaardndntresoseaeddt,,dthaaaaet.ar
bank toopdeertaetrimoninse tellers.
1-3 Model for an Abstract Data Type
In this section we provide a conceptual model for an Abstract Data Type (ADT).
t2rienyel.eApvwl–l♠adb3aiasqmoAene2raittsuehlbit7tevoeeo1ewa––s6{s•idauniut6rxdnFAt+Aens8mT123rneitetaboesuoasra,eegsn~s...th:r-mtinncefmhnanp,tti3DEDtaon*stcatoatyaeioipci,2ihtotpntgfeectc/ncisihotls,o…o7nnmeceuasccohiisienlfdmnn:6mtailliil(pneeaaeoscos}sgasg7ppruikrdhegrra:ioecfcattf}ssraaelaurhr,enadiaomintuiCcshmdudmttaalitsetrsaiipdagtleauooaatdtcfyabfrl:opncieetoieoiirannnnbtsaptvootatlioadmarrhaefuilgntte-ieotonnmoozeambinstnfrette.pntfhaisffheyhuetediwobdesto{tenrapdeo)eyoim-lenoneouasdgnbeapptfdtinfohricbamistotte.riedtainhahapaotteneotr.ipauthtkeaoetiagfrkathTltserndesretoaedlaeiahtsmniroapnyna.te,taenitepeatosanriasneusannod.t.ctfatsiohoatinoasnssa
算法与数据结构-03011345

算法与数据结构03011345一、算法1. 正确性:算法应能正确地解决特定问题,并产生预期结果。
2. 可读性:算法的描述应清晰、易懂,便于理解和实现。
3. 健壮性:算法应能处理各种输入数据,包括异常情况,且能给出合理的结果。
4. 效率:算法应尽可能减少计算时间和空间复杂度,提高执行效率。
二、数据结构数据结构是计算机存储、组织数据的方式,它决定了数据在计算机中的存储形式和访问方式。
常用的数据结构包括:1. 数组:一种线性表,用于存储一系列相同类型的数据。
数组的特点是随机访问速度快,但插入和删除操作较慢。
2. 链表:一种线性表,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
链表的特点是插入和删除操作较快,但随机访问速度较慢。
3. 树:一种非线性结构,由节点组成,每个节点有零个或多个子节点。
树结构包括二叉树、平衡树等,常用于查找、排序等操作。
4. 图:一种非线性结构,由节点和边组成,用于表示实体之间的关系。
图结构包括有向图、无向图等,常用于网络优化、路径规划等应用。
5. 哈希表:一种基于哈希函数的数据结构,用于快速查找、插入和删除操作。
哈希表的特点是时间复杂度低,但可能存在哈希冲突。
三、算法与数据结构在实际应用中的重要性1. 提高软件开发效率:掌握算法与数据结构,有助于开发者设计出更高效、更优化的程序,提高软件开发效率。
2. 优化数据处理:算法与数据结构在数据处理中起着关键作用,如排序、查找、压缩等操作,能够优化数据处理过程,提高数据处理速度。
4. 解决实际问题:算法与数据结构在实际应用中,如搜索引擎、推荐系统、社交网络等,能够帮助我们解决实际问题,提高生活质量。
算法与数据结构是计算机科学领域中的基础和核心,掌握它们对于提高编程能力、优化软件开发、解决实际问题具有重要意义。
希望本篇文档能够帮助您更好地理解算法与数据结构,为您的学习和工作提供有力支持。
算法与数据结构03011345四、算法设计原则1. 分治法:将一个复杂问题分解成若干个规模较小但结构与原问题相似的子问题,递归地解决这些子问题,将子问题的解合并为原问题的解。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
*******************实践教学*******************兰州理工大学计算机与通信学院2013年春季学期算法与数据结构课程设计题目1:跳马问题题目2:约瑟夫问题题目3:最短字符串专业班级:11级计算机科学与技术2班姓名:王军学号:11240222指导教师:王燕成绩:目录摘要 (3)序言 (4)第一章题目简介 (5)第二章分析需求 (6)第三章数据类型 (7)第四章各模块的流程图及伪码算法 (9)第五章函数的调用关系图 (13)第六章测试结果 (15)原程序 (24)设计总结 (35)参考文献 (36)致谢 (37)摘要本程序主要解决最短字符串问题,跳马问题,约瑟夫(Joeph)问题。
最短字符串问题是从输入中读取字符串,并按长度顺序,最短字符串优先的原则输出它们。
如果有若干字符串具有相同的长度,就按字母顺序输出它们。
跳马问题是要求在64个国际象棋格子,任意位置放一个马,如何不重复地把格子走完。
约瑟夫(Joeph)问题描述是:编号为1,2,…,n 的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。
一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。
报m 的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。
这些程序主要功能是加深我们对算法与数据结构中存储,线性表和栈的理解。
让我们对算法与数据结构有个更深刻的认识。
关键词:最短字符跳马约瑟夫序言算法与数据结构在计算机科学与技术中,尤其是在计算机软件设计中有举足轻重的重要作用。
在几乎所有的计算机软件系统中,如操作系统、数据库系统、编译系统、计算机网络技术、软件工程等都要用到算法与数据结构的知识。
算法与数据结构已经成为计算机科学与技术专业和其他与软件有关专业的重要的专业基础课。
本文通过约瑟夫(Joeph)问题,最短字符串问题,跳马问题加深我们对算法与数据结构的认识及学习算法与数据结构的重要性。
本文通过这三个简单程序介绍链式存储中单链表循环以及线性表中栈的应用和数组的应用。
通过对跳马问题研究,可以加深我们对栈中栈的初始化,入栈,出栈的理解。
知道栈在算法与数据结构中的重要性。
让我们在学习算法与数据结构时对栈有一个清晰的认识,以便与为今后的软件开发打好基础。
约瑟夫(Joeph)问题采用单链表循环结构,表中所有结点被链在一个环上。
因为从表中任何一个结点出发均可访问到表中的其他结点。
约瑟夫(Joeph)问题是单链表循环最好的展现。
让我们知道在数据处理过程中循环的重要性,在存储过程中空间的节约有着重要作用。
最短字符串问题采用数组的方式建立起来的。
通过本文三个简单而具有代表性的程序,让我知道循环单链表,栈,数组在算法与数据结构重要性。
也给我们在今后的学习中铺平道路,了解在软件开发中算法设计是很重要的。
本文只对这三种算法加以说明和应用,在算法与数据结构中对复杂的数据结构如二叉树、图、散结结构没有加以说明和应用。
希望读者在学习算法与数据结构时对这些数据结构也要重视。
为将来软件开发打好基础。
本文在写时由于时间紧迫,个人能力有限难免会有一些错误,真诚地希望读者批评指正。
第一章题目简介1.约瑟夫(Joeph)问题。
是描述一种:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。
一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。
报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。
试设计一个程序求出出列顺序。
2.最短字符串问题。
编写一个程序,从输入中读取字符串,并按长度顺序,最短字符串优先的原则输出它们。
如果有若干字符串具有相同的长度,就按字母顺序输出它们。
3.跳马问题。
要求在64个国际象棋格子,任意位置放一个马,如何不重复地把格子走完。
第二章分析需求1.约瑟夫(Joeph)问题:该问题适合采用循环单链表(为了便于操作,可使其不带头结点)存储相关数据。
问题求解时,首先从头指针顺序从1扫描到第m 个结点,取其密码作为新的报数上限m,输出其序号,删除该结点,然后从其后继结点重复上述动作,直到输出n 个结点。
2.最短字符串问题:该问题通过输入一些字符串,通过判断字符串的长短优先输出最短的字符串,如果长度相同则按字母顺序输出字符串。
该程序采用数组的形式来实现该问题。
3.跳马问题:国际象棋中马采用“日”字走法,对棋盘上任意一个马所在的结点,它所能走的结点在一步之内有八种情况,即假设马所在的坐标为(i,j),那么它能走的八个坐标分别为(i+1,j+2),(i+1,j-2),(i+2,j-1),(i+2,j+1),(i-2,j-1),(i-2,j+1),(i-1,j-2),(i-1,j+2),把这八个点个看做是(i,j)的领接点,以此类推每个结点都有邻结点,所以可采用图的深度遍历,以马所在的结点(i,j)为初始结点,对全图进行深度遍历,然后按照遍历的顺序输出结点。
第三章数据类型1.约瑟夫(Joeph)问题创建节点Node链表都是由一个个结点组成,由于结点的不同,组成的链表也不同。
由于每一个结点有一个密码和一个序号,所以可以将结点结构体定义为typedef struct jos{int order;int mima;struct jos *link;}Node;2.最短字符串问题最短字符串采用数组的形式进行输入和排序的,通过子函数input(char *str1[])进行输入的,通过子函数input(char *str2[])对输入的字符串进行排序。
#define Max 100 //预设最大字符串个数#define MaxSize 256int num; //全局变量num表示输入字符串3.跳马问题#define MAXNUM 8 //横纵格数最大值#define INVALIDDIR - 1 //无路可走的情况#define MAXLEN 64 //棋盘总格数#define MAXDIR 8 //下一步可走的方向typedef struct{int x; //表示横坐标int y; //表示纵坐标int direction; //表示移动方向 }HorsePoint;HorsePoint ChessPath[MAXLEN]; //模拟路径栈int count; //入栈结点个数 int ChessBoard[MAXNUM][MAXNUM]; //标志棋盘数组第四章各模块的流程图及伪码算法1.约瑟夫(Joeph)问题1.1 约瑟夫循环流程图图 11.2伪码算法创建单循环链表创建一个空单循环链表,双向循环链表和每个结点包括两个域:元素域和指针域。
形成单循环链表的原理:定义三个指针变量head,p, q三指针开始全部指向头结点,在插入操作开始后,head不变仍指向头结点,p指针在插入过程中始终指向新插入的节点,而q指针紧随其后,用于将新插入的节点和前一个节点连接起来,最后通过q指向头指针head,来完成环的操作。
关键代码实现如下:p=(Node *)malloc(sizeof(Node));q->link=p;p->order=i+1;p->mima=s[i+1];q=p;2.最短字符串问题2.1 字符串的输入代码通过建立数组str1[],当字符串的格数小于宏定义中 num 时,可以输入一些字符串。
具体代码如下:int input(char *str1[]){int count=0;char temp[MaxSize];printf("输入字符串个数");scanf("%d",&num);while(count<num){printf("输入第%d个",count+1);if(scanf("%s",temp)&&temp[0]!='\0'){str1[count]=(char *)malloc(sizeof(temp));strcpy(str1[count],temp);}count++;}puts("输入完毕!");return 1;}2.2 字符串的排序代码当输入字符串时,调用函数 sort() 进行排序,更具字符串的长短进行排序。
如果字符串长度相同时,可以更具字母优先进行排序,具体代码如下:int sort(char *str2[]){int i,j;char temp[MaxSize];for(i=0;i<num-1;i++){for(j=i+1;j<num;j++){if(strlen(str2[j])<strlen(str2[i])){strcpy(temp,str2[j]);strcpy(str2[j],str2[i]);strcpy(str2[i],temp);}if(strlen(str2[j])==strlen(str2[i]))if(strcmp(str2[j],str2[i])<0){strcpy(temp,str2[j]);strcpy(str2[j],str2[i]);strcpy(str2[i],temp);}}}puts("排序完毕!");return 1;}3.跳马问题3.1 棋盘初始化伪码棋盘初始化的数组,通过建立Initiai()函数。
将马没有在棋盘上走过的位置初始化为0,用ChessBoard[i][j]=0;表示。
其代码如下:void Initial() //棋盘初始化的数组{int i,j;for(i=0;i<MAXNUM;i++)for(j=0;j<MAXNUM;j++)ChessBoard[i][j]=0; //棋盘格均初始化为0,表示没有走过for(i=0;i<MAXLEN;i++){ChessPath[i].x=0;ChessPath[j].y=0;ChessPath[i].direction=INVALIDDIR;}count=0; // 栈中最初没有元素}第五章函数的调用关系图1.约瑟夫问题2.最短字符串问题3.跳马问题第六章测试结果1.约瑟夫问题1.实验用例人数(n)=5 各自密码:12 4 3 5 6 初值:82.测试结果(1 )输入人数(2)输入各自的密码(3)输入初始值(4)出列顺序2.最短字符串问题2.1使用例子输入字符串 qwert qwsacde asnde toubo排序后 asnde qwert toubo qwsacde 2.2测试结果(1)主菜单(2)输入字符串(3)排序后的结果3.跳马问题(1)输入初始值 2,4 0,0 (2)测试结果原程序1.约瑟夫问题#include<stdio.h>#include<stdlib.h>typedef struct jos{int order;int mima;struct jos *link;}Node;Node *creat(int n){Node *p,*q,*head;int i,s[100]; //输入各自的密码printf("请输入各自的密码:");for(i=1;i<=n;i++)scanf("%d",&s[i]);head=(Node *)malloc(sizeof(Node)); //建立循环单链表head->order=1;head->mima=s[1];q=head;for(i=1;i<=n-1;i++){p=(Node *)malloc(sizeof(Node));q->link=p;p->order=i+1;p->mima=s[i+1];q=p;} //将新结点插在链表的尾部p->link=head; //首位相接构成循环单链表return head;}void main(){Node *head,*q,*p;int i,m,n,count=1,t=0,del[100];printf("请输入人数(n):");scanf("%d",&n);head=creat(n);p=head;q=head;printf("请输入初值(m):");scanf("%d",&m);for(i=1;i<=n;i++){while(count!=m){q=p;p=p->link;count++;}del[i]=p->order;m=p->mima;q->link=p->link;free(p);p=q->link;count=1;}printf("出列顺序为:\n");if(n==1)printf("%d",1);elsefor(i=1;i<=n;i++)printf("%d\n",del[i]);}2.最短字符串问题#include<stdio.h>#include<stdlib.h>#include<string.h>#define Max 100 //预设最大字符串个数#define MaxSize 256int num; //全局变量num表示输入字符串个数//字符串输入函数int input(char *str1[]){int count=0;char temp[MaxSize];printf("输入字符串个数");scanf("%d",&num);while(count<num){printf("输入第%d个",count+1);if(scanf("%s",temp)&&temp[0]!='\0'){str1[count]=(char *)malloc(sizeof(temp));strcpy(str1[count],temp);}count++;}puts("输入完毕!");return 1;}//字符串排序函数int sort(char *str2[]){int i,j;char temp[MaxSize];for(i=0;i<num-1;i++){for(j=i+1;j<num;j++){if(strlen(str2[j])<strlen(str2[i])){strcpy(temp,str2[j]);strcpy(str2[j],str2[i]);strcpy(str2[i],temp);}if(strlen(str2[j])==strlen(str2[i]))if(strcmp(str2[j],str2[i])<0){strcpy(temp,str2[j]);strcpy(str2[j],str2[i]);strcpy(str2[i],temp);}}}puts("排序完毕!");return 1;}//字符串显示函数void show(char *str[]){int i;for(i=0;i<num;i++)puts(str[i]);}void menu(){puts("====================================================");puts("============= 最短字符串问题 ============");puts(" 1、输入字符串 ");puts(" 2、排序字符串 ");puts(" 3、输出字符串 ");puts(" 4、退出 ");puts("===================================================="); }int main(){int key,flag1=0,flag2=0;char *str1[Max];while(1){system("cls"); //清屏fflush(stdin);menu();printf("请选择(1/2/3):\n");scanf("%d",&key);if(key==1)flag1=input(str1);else if(key==2)if(flag1)flag2=sort(str1);elseputs("没有字符串!请选择1、输入字符串!");else if(key==3)if(flag1==1&&flag2==0){puts("输入的字符串为:");show(str1);}else if(flag1==1&&flag2==1){puts("排序后的字符串为:");show(str1);}elseputs("没有字符串!请选择1、输入字符串!");else if(key==4)return 0;elseprintf("对不起,没有这个选项!\n");system("pause"); //暂停}}3.跳马问题#include<stdio.h>#include<stdlib.h>#define MAXNUM 8 //横纵格数最大值#define INVALIDDIR - 1 //无路可走的情况#define MAXLEN 64 //棋盘总格数#define MAXDIR 8 //下一步可走的方向typedef struct{int x; //表示横坐标int y; //表示纵坐标int direction; //表示移动方向}HorsePoint;HorsePoint ChessPath[MAXLEN]; //模拟路径栈int count; //入栈结点个数int ChessBoard[MAXNUM][MAXNUM]; //标志棋盘数组void Initial() //棋盘初始化的数组{int i,j;for(i=0;i<MAXNUM;i++)for(j=0;j<MAXNUM;j++)ChessBoard[i][j]=0; //棋盘格均初始化为0,表示没有走过for(i=0;i<MAXLEN;i++){ChessPath[i].x=0;ChessPath[j].y=0;ChessPath[i].direction=INVALIDDIR;}count=0; // 栈中最初没有元素}void PushStack(HorsePoint positon) //入栈函数{ChessBoard[positon.x][positon.y]=1; //把标志设为1,证明已走过ChessPath[count]=positon;count++;}HorsePoint PopStack() //出栈函数{HorsePoint positon;count--;positon=ChessPath[count];ChessBoard[positon.x][positon.y]=0;ChessPath[count].direction=INVALIDDIR;return positon;}HorsePoint GetInitPoint() //输入horse的起始坐标{HorsePoint positon;do{printf("\n请输入起始点(x,y):");scanf("%d,%d",&positon.x,&positon.y);printf("\n\n");}while(positon.x>=MAXNUM||positon.y>=MAXNUM||positon.x<0||positon.y<0); //不超过各个边缘positon.direction=INVALIDDIR; //是初值,没走过return positon;}HorsePoint GetNewPoint(HorsePoint *parent) //产生新结点函数{int i;HorsePoint newpoint;int tryx[MAXDIR]={1,2,2,1,-1,-2,-2,-1}; //能走的8个方向坐标增量int tryy[MAXDIR]={-2,-1,1,2,2,1,-1,-2};newpoint.direction=INVALIDDIR; //新结点可走方向初始化parent->direction=parent->direction++; //上一结点能走的方向for(i=parent->direction;i<MAXDIR;i++){newpoint.x=parent->x+tryx[i]; //试探新结点的可走方向newpoint.y=parent->y+tryy[i];if(newpoint.x<MAXNUM&&newpoint.x>=0&&newpoint.y<MAXNUM&&newpoint.y>=0&&Ches sBoard[newpoint.x][newpoint.y]==0){parent->direction=i; //上一结点可走的方向ChessBoard[newpoint.x][newpoint.y]=1; //标记已走过return newpoint;}}parent->direction=INVALIDDIR;return newpoint;}void CalcPoint(HorsePoint hh ) //计算路径函数{HorsePoint npositon;HorsePoint *ppositon;Initial(); //调用初始化函数ppositon=&hh; //调用输入初始点函数PushStack(*ppositon);while(!(count==0||count==MAXLEN)) //当路径栈不满或不空时{ppositon=&ChessPath[count-1]; //指针指向栈npositon=GetNewPoint(ppositon); //产生新的结点if(ppositon->direction!=INVALIDDIR) //可以往下走{ChessPath[count-1].direction=ppositon->direction;PushStack(npositon);}elsePopStack();}}void PrintChess() //以8*8矩阵的形式输出运行结果{int i,j;int state[MAXNUM][MAXNUM]; //state[i][j]为棋盘上(i,j)点被踏过的次序int step=0; //行走初始化HorsePoint positon;count=MAXLEN;if(count==MAXLEN) //当棋盘全部走过时{for(i=0;i<MAXLEN;i++){step++;positon=ChessPath[i];state[positon.x][positon.y]=step;}for(i=0;i<MAXNUM;i++){printf("\t\t");for(j=0;j<MAXNUM;j++){if(state[i][j]<10)printf(" ");printf("%6d",state[i][j]); //按顺序输出马踏过的点}printf("\n");}printf("\n");}elseprintf("\t\t此时不能踏遍棋盘上所有点!\n");}int main(int argc,char *argv[]){HorsePoint h;h=GetInitPoint();CalcPoint(h);PrintChess();return 0;}设计总结数据结构是计算机程序设计的重要理论技术基础,它是计算机科学的核心课程。