2013年算法与数据结构文档

合集下载

2013年算法与数据结构任务书

2013年算法与数据结构任务书

算法与数据结构课程设计任务书(2011级计算机科学与技术本科专业)题目:1.表达式转换问题;2.跳马问题。

学生姓名:姚孟斌学号:11240230 班级:2011级计算机科学与技术题目类型:软件工程(R)指导教师:王燕一.题目简介1.表达式转换问题。

请编写一个读取中缀表达式并生成后缀表达式的程序。

2.跳马问题。

要求在64个国际象棋格子,任意位置放一个马,如何不重复地把格子走完。

二、各题目的设计与实现要求1、查阅文献资料,一般在3篇以上;2、建立数据的逻辑结构和物理结构;3、完成相应算法的设计;4、完成程序的实现;5、完成测试工作;5、撰写设计说明书;6、做好答辩工作。

三、提交的成果1. 设计说明书一份,内容包括:1) 中文摘要100字;关键词3-5个;2) 序言;3)采用类c语言定义相关的数据类型4)各模块流程图及伪码算法5)函数的调用关系图6)调试分析a、调试中遇到的问题及对问题的解决方法;b、算法的时间复杂度和空间复杂度。

7)测试结果8)源程序(带注释)9) 设计总结、参考文献、致谢等。

2. 刻制光盘一张。

四、主要参考文献1 严蔚敏,吴伟民.《数据结构(C语言版)》.清华大学出版社.2 严蔚敏,吴伟民.《数据结构题集(C语言版)》.清华大学出版社.3 《DATA STRUCTURE WITH C++》. William Ford,William Topp.清华大学出版社(影印版).4 谭浩强.《c语言程序设计》. 清华大学出版社.5.数据结构与算法分析(Java版), A Practical Introduction to Data Structures and Algorithm Analysis Java Edition Clifford A. Shaffer , 张铭,刘晓丹译电子工业出版社2001 年1月五、各阶段时间安排(共3周)2013年6月30日。

第13章 数据结构与算法

第13章 数据结构与算法
3 目录
第13章 数据结构与算法
13.1.2 算法复杂度 算法复杂度的评价有两个指标:时间复杂度、空间复 杂度 1.算法的时间复杂度 算法所执行的基本运算次数是问题规模的函数,即 算法工作量=f(n) 2.算法的空间复杂度
4
目录
xDn
p( x)t ( x)
第13章 数据结构与算法
13.2 数 据 结 构
26 目录
第13章 数据结构与算法
2.二叉树的基本性质 性质1:在二叉树的第k层上,最多有2k-1(k≥1) 个结点。 性质2:深度为m的二叉树最多有2m-1 个结点。 性质3:任意一棵二叉树中,度数为0的结点(即叶 子结点)总比度为2的结点多一个。 性质4:具有n个结点的二叉树,其深度至少为 「log2n」+ l,其中「log2n」表示取的整数部 分。
25
目录
第13章 数据结构与算法
13.6.2 二叉树及其性质 二叉树(binary tree)是另一种重要的树形结构。 二叉树是度为2的有序树,它的特点是每个结点至 多有两棵子树。PABCHIJKDEFG 1.二叉树的概念 二叉树(binary tree)具有以下两个特点: ① 非空二叉树只有一个根结点。图13-19 二叉树的 示意图(b)深度为4的二叉树(a)只有根结点的 二叉树 ② 每一个结点最多有两棵子树,称为该结点的左子树 和右子树。
16
目录
第13章 数据结构与算法
队列的常用运算有两种:入队运算、退队运算。 (1)入队运算 入队运算是指在队列的队尾加入一个新元素。它包 含两个基本操作:首先将队尾指针rear加1,然后 将新元素插入到rear所指向的位置。当队尾指针指 向队列的存储空间的最大位置时,说明队列已满, 不能进行入队操作,这种情况称为“上溢”错误。 (2)退队运算 退队运算是指从队列的队头退出一个元素。它包含 两个基本操作:首先将队头指针front加1,然后将 front所指向的元素赋值给一个变量。当队头指针 等于队尾指针时,说明队列已空,不能进行退队操 作,这种情况称为“下溢”错误。

《数据结构与算法》实验指导书2013版

《数据结构与算法》实验指导书2013版

《数据结构与算法》实验指导书大连民族学院信息与通信工程学院2013 年10 月10 日基本要求1.学生必须按时到实验室做实验,不得迟到早退,未经老师批准不得中途离开。

凡迟到者,应给予批评并作适当扣分。

实验课迟到20分钟以上及无故缺席者视为旷课,旷课者不予补做实验,本次实验以零分计。

学生因病或特殊情况不能按时到实验室做实验时,应办理正常请假手续。

请病假必须有医生签字的病假条,请事假必须有班主任签字的事假条。

不符合请假手续的,以旷课论处。

请假的学生由指导教师安排补做实验。

对于未做实验数达三分之一以上(含三分之一)的学生,实验课程按0分计。

2.学生在每次实验课之前,应仔细阅读实验教材,查阅相关的资料,写出预习报告。

预习报告的具体内容包括:实验内容、实验目的、实验原理图、实验步骤、实验数据记录表格等。

实验课前由任课教师检查预习报告,未写预习报告者不予做实验。

3.做实验前,了解设备的原理和正确使用方法。

在没有弄懂仪器设备的使用方法前,不得贸然使用,否则因使用不当造成仪器设备损坏的,根据大连民族学院《仪器设备损坏丢失处理暂行办法》规定进行处理。

实验室内设备在实验过程中不准任意搬动和调换,非本次实验所用仪器设备,未经指导教师允许不得动用。

4.要求每位学生在实验过程中,要具有严谨的学习态度、认真、踏实、一丝不苟的科学作风。

实验过程中学生按照预习的内容进行实验,且重视实验的调试过程,学会如何根据实验现象判断问题所在。

坚持每次实验都要亲自动手,不可“坐车”,每个实验每个学生都要独立完成,不允许抄袭,无特殊原因,中途不得退出实验,否则本次实验无效。

5.实验中若接线、改接、拆线都必须在切断电源的情况下进行,线路连接完毕再送电。

实验中,特别是设备刚投入运行时,要随时注意仪器设备的运行情况,如发现有过热、异味、冒烟、火花等,应立即断电,并请指导老师检查、处理。

6.实验过程中,如出现事故,就马上拉开电源开关,然后找指导教师和实验技术人员,如实反映事故情况,并分析原因和处理事故。

算法与数据结构课设(有向图,无向图,有向网,无向网)

算法与数据结构课设(有向图,无向图,有向网,无向网)

算法与数据结构课程设计报告系(院):计算机科学学院专业班级:教技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(权值)。

数据结构和算法第三章2013.ppt

数据结构和算法第三章2013.ppt

//‘关系’算子,用于比较相等、大、小,例如 bool operator< (char *s);//比较大小,本串小于标准串s则返回非0 bool operator< (String& s);//比较大小,本串小于串s则返回非0 friend bool operator< (char *s1, String& s); //友函数用于比较, // ,标准串s1小于串s,则返回非0 //‘输入输出’算子>>和<< 以及读子串等,例如友函数 friend istream& operator>> (isteream& istr,String& s); friend ostream& operator<< (osteream& ostr,String& s); // ‘子串函数’:插入子串、寻找子串、提取子串、删除子串等,例
‘实例串’
//在程序首,要#include <string.h>和#include <iostream.h>及 // 及#include <stdlib.h>,以及#include <assert.h>
{ //1.字符串的数据表示: //字符串S 通常用顺序存放,用数组S[]存储,元素的类型为
char //字符串为变长,使用变量size记录串的当前长度 // 2.使用变量访问字符串: //字符串变量能参与运算,例如S1 + S2表示两个字符串首尾
空串:长度为零的串,它不包含任 何字符内容。
3.1.1.1字符串常数和变量
字符串常数 例如: "\n"
字符串变量

算法设计与第三章2算法与数据结构

算法设计与第三章2算法与数据结构
3)考虑到算法的健壮性,要排除对 1——5之外的数据进行 统计。
算法如下:
vote( ) { int i,xp,a[6]; print(“input data until input -1 ”); input(xp ); while(xp!=-1)
{if (xp>=1 and xp<=5 )
a[xp]=a[xp]+1;
main( )
{int a[10],i,xh;
for(i =1;i<=21;i=i+1) {input(xh);
a[xh]=a[xh]+1;}
for(xh =1;xh<=9;xh=xh+1)
if(a[xh] =3 )
print(xh); }
【例4】统计找数字对的出现频率
算法说明: 输入N(2≤N≤100)个数字(在0与9之间),然后统计出这组数中相邻两 数字组成的链环数字对出现的次数。例如: 输入:N=20 {表示要输入数的数目}
算法如下:
main( )
{ int i,xp,a[8];
print(“input height data until input -1 ”);
input(sg );
while (sg<>-1)
{if (sg>179)
a[7]=a[7]+1

else
if (sg<150) a[0]=a[0]+1

else a[sg/5-29]=a[sg/5-29]+1
{input(k1); a[k0][k1]=a[k0][k1]+1; k0
for (i=0;i<=9;i=i+1) for (j=0;j<=9;j=j+1)

C语言公共基础:算法与数据结构

C语言公共基础:算法与数据结构

第十二章算法与数据结构12.1算法的基本概念该节知识点所占试题比重为12%,属于重点考查对象,基本上每次必考,主要考查算法的定义和对算法复杂度的理解。

历次试题分值在0-4分之间波动。

12.1.1考点1:算法的定义算法是对一个问题求解步骤的一种描述,是求解问题的方法,它是指令的有限序列,其中每条指令表示一个或者多个操作。

一般来说,一个算法具有以下5个主要特性。

(1)有穷性:一个算法(对任何合法的输入)在执行有穷步后能够结束,并且在有限的时间内完成。

(2)确定性:算法中的每一步都有确切的含义。

(3)可行性:算法中的操作能够用已经实现的基本运算执行有限次来实现。

(4)输入:一个算法有零个或者多个输入,零个输入就是算法本身确定了初始条件。

(5)输出:一个算法有一个或者多个输出,以反映出数据加工的结果。

12.1.2 考点2:算法复杂度算法复杂度包括时间复杂度和空间复杂度,是衡量一个算法好坏的度量。

1、时间复杂度在一般情况下,算法中的基本操作重复执行的次数是问题规模n的函数f(n),那么算法的时间复杂度可记作:K(n)=O(f(n))表示随着问题规模n的增大,算法执行时间的增长率与f(n)的增长率相同。

2、空间复杂度与时间复杂度相似,空间复杂度是算法所需空间的度量。

G(n)= O(f(n))其中,n是问题的规模,表示随着问题规模n的增大,算法执行空间的增长率与f(n)的增长率相同。

12.2 数据结构的定义该节知识点所占试题比重为12%,属于重点考查对象,基本上每次必考,主要考查数据的逻辑结构和存储结构。

历次试题分值在0-4分之间波动。

12.2.1考点1:什么是数据结构数据结构是计算机科学与技术领域广泛使用的一个基本术语,用来反映数据的内部构成。

在给出数据结构的定义前,我们先给出几个概念和术语。

数据是对客观事物的符号表示,在计算机科学中,指所有能输入到计算机并被计算机处理的符号的总称。

数据元素是数据的基本单位,一般由若干数据项构成,数据项是数据的最小单位。

2013年算法与数据结构文档

2013年算法与数据结构文档

*******************实践教学*******************兰州理工大学电脑与通信学院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〕问题,最短字符串问题,跳马问题加深我们对算法与数据结构的认识及学习算法与数据结构的重要性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;}设计总结数据结构是计算机程序设计的重要理论技术基础,它是计算机科学的核心课程。

相关文档
最新文档