数据结构课程设计文档
数据结构课程设计

目录1问题描述 (2)2基本要求 (2)2.1问题分析及解决法案框架确定 (2)2.2程序设计 (2)2.3详细设计和编码 (2)3算法思想 (2)4模块划分 (3)4.1对各个模块进行功能的描述 (3)4.2模块之间关系及其相互调用 (3)5数据结构 (5)5.1定义栈 (5)5.2定义队列 (5)5.3栈的基本操作 (5)5.4队列的基本操作 (6)6测试数据 (6)7测试情况 (6)8总结 (9)1 问题描述试写一个算法,判断依次读入的一个以@为结束符的字母序列,是否为形如‘序列1&序列2’模式的字符序列。
其中序列1和序列2中都不含字符‘&’,且序列2是序列1的逆序列。
例如,‘a+b&b+a’是属该模式的字符序列,而‘1+3&3-1’则不是。
栈和队列是一种常见的数据结构,是两种非常重要的线性结构,也都是线性表,它们是操作受限的的线性表,有顺序栈、链式栈、链式队列和循环队列等形式。
它们广泛应用在各种软件系统中。
本题就是要用这些线性结构先完成基本的应用,如回文,逆置。
2 基本要求2.1问题分析及解决法案框架确定充分地分析和理解问题本身,使程序结构清晰合理简单和易于调试,并确定每个函数的简单功能,以及函数之间的调用关系。
2.2程序设计1、选择顺序栈和链队列,完成回文判断、字符串的逆置;2、选择链栈和循环队列,完成回文判断、字符串的逆置;3、运用掌握C语言编写程序,实现所编程序的各个模块功能。
2.3详细设计和编码给出所有源程序清单,要求程序有充分的注释语句,至少要注释每个函数参数的含义和函数返回值的含义。
3 算法思想运用栈和队列算法,在序列依次输入时将序列分别入栈和入队列,利用栈FILO 和队列FIFO的特点,通过出栈和出队列实现序列顺序和逆序的比较,根据题目描述的回文序列判断并输出结果。
定义顺序栈和链队列及关于它们的基本操作,如定义栈和队列、求栈和队列的长度、入栈出栈、入队列出队列等。
数据结构课程设计(哈夫曼编码)

┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊目录目录 (1)1 课程设计的目的和意义 (2)2 需求分析 (3)3 系统设计 (4)(1)设计思路及方案 (4)(2)模块的设计及介绍 (4)(3)主要模块程序流程图 (6)4 系统实现 (10)(1)主调函数 (10)(2)建立HuffmanTree (10)(3)生成Huffman编码并写入文件 (13)(4)电文译码 (14)5 系统调试 (16)小结 (18)参考文献 (19)附录源程序 (20)┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊1 课程设计的目的和意义在当今信息爆炸时代,如何采用有效的数据压缩技术来节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视。
哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。
哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。
树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为和各个对应的字符的编码,这就是哈夫曼编码。
通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。
电报通信是传递文字的二进制码形式的字符串。
但在信息传递时,总希望总长度尽可能最短,即采用最短码。
作为软件工程专业的学生,我们应该很好的掌握这门技术。
在课堂上,我们能过学到许多的理论知识,但我们很少有过自己动手实践的机会!课程设计就是为解决这个问题提供了一个平台。
在课程设计过程中,我们每个人选择一个课题,认真研究,根据课堂讲授内容,借助书本,自己动手实践。
这样不但有助于我们消化课堂所讲解的内容,还可以增强我们的独立思考能力和动手能力;通过编写实验代码和调试运行,我们可以逐步积累调试C程序的经验并逐渐培养我们的编程能力、用计算机解决实际问题的能力。
学生成绩管理系统,数据结构课程设计

课程设计任务书学生姓名:专业班级:指导教师:工作单位:题目:学生成绩管理系统已知技术参数和设计要求:现有学生成绩信息文件1(cj1。
txt),内容如下姓名学号语文数学英语张明明 01 67 78 82李成友 02 78 91 88张辉灿 03 68 82 56王露 04 56 45 77陈东明 05 67 38 47…. 。
. 。
…学生成绩信息文件2(cj2.txt),内容如下:姓名学号语文数学英语陈果 31 57 68 82李华明 32 88 90 68张明东 33 48 42 56李明国 34 50 45 87陈道亮 35 47 58 77…. 。
.. .. …试编写一管理系统,其基本功能要求:实现对两个文件数据进行合并,生成新文件cj3.txt抽取出三科成绩中有补考的学生并保存在一个新文件cj4.txt对合并后的文件3。
txt中的数据按总分降序排序(至少采用两种排序方法实现)输入一个学生姓名后,能查找到此学生的信息并输出结果(至少采用两种查找方法实现)要求使用结构体,链或数组等实现上述要求。
采用多种方法且算法正确者,可适当加分。
要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)数据结构课程设计说明书一、需求分析1、问题描述现如今,学校人数的暴涨,对学生基本信息的录入,保存量越来越大,为了简化对工作人员的操作,故设计一个程序来完成对学生基本信息的录入,保存,编辑等简单操作。
2、基本任务(1)对学生信息表cj1和cj2进行合并;(2)把合并的信息生成cj3;(3)把cj3中有补考的学生信息生成cj4;(4)对合并后的文件3。
txt中的数据按总分降序排序;(5)输入一个学生姓名后,能查找到此学生的信息并输出结果。
二、概要设计为了完成需求分析的基本任务,主要从以下3个方面进行设计:1、主界面设计为了实现学生成绩管理系统的各项功能,设计了一个含有多个菜单项的主控菜单模块以链接系统的各项功能,以方便用户使用系统。
数据结构课程设计实验报告 完整版

第一章链表的应用线性表是数据结构中最简单、最常用的一种线性结构,也是学习数据结构全部内容的基础,其掌握的好坏直接影响着后继课程的学习。
线性表的顺序存储结构,即顺序表的概念相对比较简单,因此,本章的主要任务是使用有关单链表的操作来实现通讯录信息系统的管理。
1.1设计要求本章的设计实验要求使用有关链表的操作来实现通讯录信息系统的管理。
为了验证算法,通讯录管理包括单通讯录链表的建立、通讯者的插入、通讯者的删除、通讯者的查询及通讯录表的输出等。
主控菜单的设计要求使用数字0—5来选择菜单项,其他输入则不起作用。
程序运行后,给出6个菜单项的内容和输入提示:1.通讯录链表的建立2. 通讯者结点的插入3. 通讯者结点的查询4. 通讯者结点的删除5. 通讯录链表的输出0. 退出管理系统请选择0—5:1.2设计分析1.2.1主控菜单函数设计分析1.实现循环和功能选择首先编写一个主控菜单驱动程序,输入0—5以进入相应选择项。
假设输入选择用变量sn存储,它作为menu_select函数的返回值给switch语句。
使用for循环实现重复选择,并在主函数main()中实现。
实际使用时,只有选择大于5或小于0的值,程序才能结束运行,这就要使用循环控制。
这里使用for循环语句实现菜单的循环选择,为了结束程序的运行,使用了“return”语句,也可以使用“exit(0);”语句。
2.得到sn的合理值如前所述,应该设计一个函数用来输出提示信息和处理输入,这个函数应该返回一个数值sn,以便供给switch语句使用。
假设函数名为menu_select,对于sn的输入值,在switch 中case语句对应数字1—5,对于不符合要求的输入,提示输入错误并要求重新输入。
将该函数与主函数合在一起,编译运行程序,即可检查并验证菜单选择是否正确。
1.2.2功能函数设计分析1.建立通讯录链表的设计这里实际上是要求建立一个带头结点的单链表。
建立单链表有两种方法,一种称之为头插法,另一种称为尾插法。
家族关系查询系统数据结构课程设计

家族关系查询系统数据结构课程设计
家族关系查询系统的数据结构可以通过使用图来表示家族成员之间的关系。
以下是一个可能的数据结构设计:
1. 节点:每个节点表示一个家庭成员,包含以下信息:
- 姓名
- 性别
- 出生日期
- 死亡日期(可选)
- 配偶节点指针(如果有)
- 父母节点指针
- 子女节点指针列表
2. 图的表示:使用邻接表或邻接矩阵来表示家族成员之间的关系。
3. 数据结构的操作:
- 添加家庭成员节点
- 删除家庭成员节点
- 添加婚姻关系
- 删除婚姻关系
- 添加父子关系
- 删除父子关系
- 查询某个人的配偶、父母、子女信息
- 查询某个人的兄弟姐妹信息
- 查询某个人的祖先、后代信息
- 查询某个人的近亲结构
- 查询某个人的家族全貌
4. 数据结构的实现:
- 可以使用面向对象的方式,将节点定义为一个类,使用指针/引用来连接不同的家庭成员。
- 使用图的数据结构来表示家族关系。
可以使用邻接表,每个节点对应一个家庭成员,每个节点的边表示亲属关系。
注意,上述只是一个概念性的设计,具体的实现可能需要根据具体的需求进行调整和扩展。
数据结构课程设计报告

*****数据结构课程设计题目: 赫夫曼树的建立运动会分数统计订票系统猴子选大王图的建立与输出姓名:***学号 ****专业:计算机科学与技术指导教师:****2006年9月20日目录一:绪言 (3)1.1课题设计背景 (3)1.2课题研究的目的和意义…………………………….3.1.3课题研究的内容 (4)二:主菜单设计 (4)2.1主菜单 (4)2.2主菜单源代码 (4)2.3主菜单流程图 (5)三:具体程序设计 (6)3.1赫夫曼树的建立 (6)3.2运动会设计 (8)3.3订票系统 (12)3.4猴子选大王 (15)3.5图的建立及输出 (16)四:总结与展望 (19)五:参考文献 (19).1.绪言1.1 课题背景《数据结构》作为一门独立的课程最早是美国的一些大学开设的,1968年美国唐·欧·克努特教授开创了数据结构的最初体系,他所著的《计算机程序设计技巧》第一卷《基本算法》是第一本较系统地阐述数据的逻辑结构和存储结构及其操作的著作。
从60年代末到70年代初,出现了大型程序,软件也相对独立,结构程序设计成为程序设计方法学的主要内容,人们就越来越重视数据结构,认为程序设计的实质是对确定的问题选择一种好的结构,加上设计一种好的算法。
从70年代中期到80年代初,各种版本的数据结构著作就相继出现。
目前在我国,《数据结构》也已经不仅仅是计算机专业的教学计划中的核心课程之一,而且是其它非计算机专业的主要选修课程之一。
《数据结构》在计算机科学中是一门综合性的专业基础课。
数据结构的研究不仅涉及到计算机硬件(特别是编码理论、存储装置和存取方法等)的研究范围,而且和计算机软件的研究有着更密切的关系,无论是编译程序还是操作系统,都涉及到数据元素在存储器中的分配问题。
在研究信息检索时也必须考虑如何组织数据,以便查找和存取数据元素更为方便。
因此,可以认为数据结构是介于数学、计算机硬件和计算机软件三者之间的一门核心课程,在计算机科学中,数据结构不仅是一般程序设计(特别是非数值计算的程序设计)的基础,而且是设计和实现编译程序、操作系统、数据系统及其它系统程序和大型应用程序的重要基础。
数据结构课程设计(家族关系查询系统)
数据结构课程设计(家族关系查询系统)1 课程设计介绍1.1课程设计项目简介家谱是一种以表谱形式,记载一个以血缘关系为主体的家族世系繁衍和重要人物事迹的特殊图书载体。
家谱是中国特有的文化遗产,是中华民族的三大文献之一,属珍贵的人文资料,对于历史学,民俗学,人口学,社会学和经济学的深入研究,均有不可替代的重要功能。
本项目对家谱管理进行简单的模拟,以实现查看祖先和子孙个人信息、插入家族成员等功能。
1.2课设题目分析本程序的实质是完成对家谱成员信息的建立、查找、插入等功能。
可以首先定义家族成员的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结果。
本程序包含以下几个模块(1)建立家族关系树。
此模块将构建一个家族关系,对数据初始化,构造关系树并录入数据一遍后续程序使用。
(2)添加新成员。
此模块将添加一个新成员,实现对家族关系的修改。
(3)家族关系的查询。
此模块将实现对家族不同关系的查询(4)主程序模块。
此模块实现整个程序的进入和进出,以及各种初始化处理。
(5)1.3课程题目原理与数据结构因为家族的成员之间存在一个对多个的层次结构关系,所以不能用线性表来表示和实现。
家谱从形状上看像一颗倒长的树,所以用树结构来表示比较合适。
树形结构是一类非常重要的非线性数据结构,直观看来树是以分支关系定义的层次结构。
因此本课程设计可以采用的数据结构有树状结构和队列。
树状结构采用三叉链表来实现,队列采用链式队列实现。
21.4功能分析说明图34struct Node *rear; /* 尾指针*/}LinkQueue;DataType fname[MAXNUM],family[50][MAXNUM];/* 全局变量*/2.1.2 链队的基本操作LinkQueue *LQueueCreateEmpty( )/* 建立一个空队列*/{LinkQueue *plqu=(LinkQueue*)malloc(sizeof(LinkQueue));if (plqu!=NULL)plqu->front=plqu->rear=NULL;else{printf("内存不足!\n");return NULL;}return plqu;}int LQueueIsEmpty(LinkQueue *plqu)/* 判断链接表示队列是否为空队列*/{return(plqu->front==NULL);}void LQueueEnQueue(LinkQueue *plqu,TriTree *x)/* 进队列*/ {Node *p=(Node *)malloc(sizeof(Node));if(p==NULL)printf("内存分配失败!\n");else{p->info=x;p->next=NULL;if(plqu->front==NULL)/* 原来为空队*/plqu->front=p;elseplqu->rear->next=p;5plqu->rear=p;}}int LQueueDeQueue(LinkQueue *plqu,TriTree *x)/* 出队列*/ {Node *p;if(plqu->front==NULL){printf("队列空!\n");return ERROR;}else{p=plqu->front;x=p->info;plqu->front=plqu->front->next;free(p);return OK;}}TriTree *LQueueGetFront(LinkQueue *plqu)/* 在非空队列中求队头元素*/{return(plqu->front->info);}2.2建立家族关系2.2.1建立家族关系并存入文件基本思想:首先输入家族关系的名称,以此名称为文件名,建立文本文件接下来按层次输入结点信息,输入一个在文件中写入一行同时将输入的信息保存到二位字符数组family中。
数据结构课程设计python
数据结构课程设计python一、课程目标知识目标:1. 理解数据结构的基本概念,掌握常用数据结构如列表、元组、字典和集合的特点及应用场景。
2. 学习并掌握栈和队列的操作原理及其在Python中的实现方法。
3. 掌握树和图的基本概念,了解二叉树、遍历算法及图的表示方法。
技能目标:1. 能够运用Python语言实现基本数据结构,并对其进行增、删、改、查等操作。
2. 能够利用栈和队列解决实际问题,如递归、函数调用栈、任务调度等。
3. 能够运用树和图解决实际问题,如查找算法、路径规划等。
情感态度价值观目标:1. 培养学生严谨的逻辑思维,提高分析问题和解决问题的能力。
2. 激发学生对数据结构和算法的兴趣,培养良好的编程习惯。
3. 引导学生认识到数据结构在实际应用中的重要性,增强学习热情和责任感。
课程性质:本课程为高年级数据结构课程,旨在使学生掌握Python语言实现数据结构的方法,提高编程能力和解决问题的能力。
学生特点:学生具备一定的Python编程基础,具有较强的逻辑思维能力,对数据结构有一定的了解。
教学要求:结合实际案例,采用任务驱动法,引导学生通过实践掌握数据结构的基本原理和应用方法。
注重培养学生的动手能力和团队协作精神,提高学生的综合素质。
通过本课程的学习,使学生能够具备独立设计和实现小型项目的能力。
二、教学内容1. 数据结构基本概念:介绍数据结构的概念、作用和分类,结合Python语言特点,分析各类数据结构在实际应用中的优势。
- 列表、元组、字典和集合的原理与应用- 栈与队列的操作原理及实现2. 线性表:讲解线性表的概念,重点掌握顺序表和链表的操作方法。
- 顺序表和链表的实现及操作- 线性表的查找和排序算法3. 树与二叉树:介绍树的基本概念,重点讲解二叉树的结构及其遍历算法。
- 树的基本概念和表示方法- 二叉树的性质、存储结构、遍历方法4. 图:讲解图的基本概念,掌握图的存储结构及遍历方法。
- 图的基本概念和表示方法- 图的遍历算法(深度优先搜索、广度优先搜索)- 最短路径和最小生成树算法5. 算法分析与设计:结合实例,分析算法性能,掌握基本的算法设计方法。
数据结构课程设计(家族关系查询系统)..
*/
2.1.2 链队的基本操作
LinkQueue *LQueueCreateEmpty( )/* 建立一个空队列*/ {
LinkQueue *plqu=(LinkQueue *)malloc(sizeof(LinkQueue)); if (plqu!=NULL)
plqu->front=plqu->rear=NULL; else {
printf("内存不足!\n"); return NULL; } return plqu; } int LQueueIsEmpty(LinkQueue *plqu)/* 判断链接表示队列是否为 空队列*/ { return(plqu->front==NULL); } void LQueueEnQueue(LinkQueue *plqu,TriTree *x)/* 进队列*/ { Node *p=(Node *)malloc(sizeof(Node)); if(p==NULL) printf("内存分配失败!\n"); else { p->info=x; p->next=NULL; if(plqu->front==NULL)/* 原来为空队*/
{
DataType data[MAXNUM]; struct TriTNode *parent;/* 双亲*/ struct TriTNode *lchild;/* 左孩子*/ struct TriTNode *rchild;/* 右孩子*/
}TriTree; typedef struct Node/* 队列的结点结构*/
printf("队列空!\n"); return ERROR; } else { p=plqu->front; x=p->info; plqu->front=plqu->front->next; free(p); return OK; } } TriTree *LQueueGetFront(LinkQueue *plqu)/* 在非空队列中求队 头元素*/ { return(plqu->front->info); }
数据结构课程设计说明书格式
(正文宋体小四号字,1.5倍行距)
……………………….
3.2核心代码
(正文宋体小四号字,1.5倍行距)
……………………………
3.3程序运行结果(拷屏)
(正文宋体小四号字,1.5倍行距)
4.课程设计心得、存在问题及解决方法
(正文宋体小四号字,1.5倍行距)
…………………………
中北大学
数据结构
课程设计说明书
学பைடு நூலகம்姓名:
学号:
学院:
软件学院
专业:
题目:
指导教师
2011年12月20日
1.设计任务概述(包括系统总体框图及功能描述)
(正文宋体小四号字,1.5倍行距)
2.本设计所采用的数据结构(如:链表、栈、树、图等)
(正文宋体小四号字,1.5倍行距)
3.功能模块详细设计
(正文宋体小四号字,1.5倍行距)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计题目 一、设计目的 1.加强对已学知识的巩固。 2.会灵活运用所学知识,解决具体问题。 3.对于前面部分实验内容若觉得知识量较少同学,可进行必要的补充调整。 二、设计题目(三选二) 必做题: 1、 利用栈与函数调用关系,设计一个算术表达式的求值程序。 要求:(1)算术表达式中有括号、函数。 (2)转换为后缀表达式求解。 2、当输入一棵二叉树的前序序列和中序序列(或后序序列和中序序列),请设计自动生成二叉树的程序。 要求:在程序中以简单图形的方式输出该二叉树。 2、 对一个项目数是n(10列,求出关键路径。 要求:项目数n与各项目的时间与前期项目关系可动态输入(在设计阶段可在程序中暂时给定)。 选作题: 1大数阶乘 对给定的n(n≤100),计算并输出k!(k=1,2, ……,n)的全部有效数字,因k!的值可能很大,故采用一维数组存计算结果。设数组的每个元素存储k!的一位数字,并约定从低位到高位依次存于数组的第一个位置、第二个位置、……。例如,5!=120,在数组a中的存储形式为: a[2] a[1] a[0] … 1 2 0 提示:计算k!采用对已求得的(k-1)!的结果连续累加k-1次后求出。例如,4!=24,则计算5!对原来的24再累加4次24后得到120。为了控制累加的位数,另引入整型变量用于记录当前(k-1)!的位数。 2 银行卡问题 某银行共发出M张储蓄卡,每张储蓄卡拥有唯一的卡号,每天每张储蓄卡至多支持储蓄卡持有者的N笔“存款”或“取款”业务。可用数组card[M][N+3]中的每一行存放一张储蓄卡的有关信息,其中: card[i][0] 存放第i张卡的卡号; card[i][1] 存放第i 张卡的余额; card[i][2] 存放第i张卡的当日业务实际发生笔数; card[i][3]~card[i][N+2] 存放第i张卡的当日存取款金额,正值代表存款,负值代表取款。 当持卡者输入正确的卡号、存款或取款金额后,程序进行相应的处理;若输入了不正确的数据,程序会提示持卡者重新输入;若输入的卡号为负数时,银行终止当日业务。 3 数组压缩 设某个非负整数数组中存在许多连续相等的整数段,编写程序将这样的数组按下列规则压缩到另一整数数组中: (1)一个连续相等的整数段,如有C(>1)个连续相等整数,在压缩数组中存入C和这个整数。 (2)一个不连续相等的整数段,如有C(C>1)个整数,其中每个整数与其相邻的整数不等,在压缩文件中存入-C和这C个整数。 例如,原数组为 2 2 2 4 4 4 8 3 8 1 1 1 1 2 1 则它的压缩数组为 3 2 3 4 -3 8 3 8 4 1 -2 2 1 4 找最长相同单字 从给定的两个由英文单字(词)组成的字符串s和t中,找出其中都包含的最长的相同单字(同一字母的大小写视作不同字符)。约定单字全由英文字母组成,单字之间由一个或多个空白符分隔。 提示:可自左至右顺序扫视字符串s,逐个找出单字(单字开始位置和单字长度),当该单字的长度比已找到的单字更长时,就从头至尾扫视字符串t,在从t中找出与该单字长度相等、字符相同的单字后,登录该单字的开始位置和长度,并回到s,在其中找一个更长的单字,上述寻找过程直至字符串s扫视结束,最后输出找到的单字。 5 寻找长整数 设A的个位数a[0]为指定的数p(取值分别为2,3,4,…,9,)。若将A的个位数字移到其他各位数字之前,则其数值为原数值的A的p倍。例如,p为4,则A为102564(各位数字分别存入a[5],a[4], …,a[0]之中),有102564*4=410256。 寻找从 a[0]=p出发,用p乘已确定的位数的数值可推出其前1的数字,逐位进行,直到用P乘a[n-1]等于a[0],递推计算结束,A即为: a[n-1]a[n-2] … …a[0] 数据结构与算法 课程设计报告
专业班级: 学号: 姓名:
日期: 实例 报数问题 1.问题描述 设有n个人围坐一圈并按顺时针方向1-n循环报数。若从第1个人开始报数,凡是报的数字是7的倍数(如14、49)或其中包含7(如17、71),则此人出圈,再从他的下一个人继续报数,如此进行下去,直到只有一个人为止。 设计程序,要找到那个能留到最后的人的原始位置号与最后应该报的数字。
2.算法分析与设计 3.参考程序 4.运行结果 图 是由本程序计算出的3个传教士和3个野人的安全渡河方案。
图14-1 野人渡河问题的解答 5.总结与体会 附:野人渡河程序 3个野人和3个传教士来到河边,打算乘一只船从右岸到左岸去。该船的负载能力为两人。在任何时候,如果野人人数超过传教士人数,野人就会把传教士吃掉。他们怎样才能用这条船安全地把所有人都渡过河去呢? 这个问题还可以拓展为m个野人和n个传教士,而船一次可以装下r个人的情况。
#include #include #define maxloop 100 //最大层数 #define pristnum 3 //传教士默认值 #define slavenum 3 //野人默认值 struct SPQ { int sr,pr; //船运行一个来回后河右岸的野人、传教士的人数 int sl,pl; //船运行一个来回后河左岸的野人、传教士的人数 int ssr,spr; //回来(由左向右时)船上的人数 int sst,spt; //去时(由右向左时)船上的人数 int loop; //本结点所在的层数 struct SPQ *upnode ,*nextnode; //本结点的父结点和同层的下一个结点的地址 } spq; int loopnum; //记录总的扩展次数 int openednum; //记录已扩展节点个数 int unopenednum; //记录待扩展节点个数 int resultnum; struct SPQ *opened; struct SPQ *oend; struct SPQ *unopened; struct SPQ *uend; struct SPQ *result; void initiate( ); void releasemem( ); void showresult( ); void addtoopened(struct SPQ *ntx); int search( ); void goon( ); int stretch(struct SPQ* ntx); void recorder( );
void main( ) { int flag; //标记扩展是否成功 for( ; ; ) { initiate( ); flag = search ( ); if(flag == 1) { recorder( ); releasemem( ); showresult( ); goon( ); } else { printf("无法找到符合条件的解"); releasemem( ); goon( ); } } } void initiate( ) { int x; char choice; uend = unopened = (struct SPQ*)malloc(sizeof(spq)); if(uend==NULL) { printf("\n内存不够! \n"); exit(0); } unopenednum=1; openednum=0; unopened -> upnode = unopened; //保存父结点的地址以成链表 unopened -> nextnode = unopened; unopened -> sr = slavenum; unopened -> pr = pristnum; unopened -> sl = 0; unopened -> pl = 0; unopened -> sst = 0; unopened -> spt = 0; unopened -> ssr = 0; unopened -> spr = 0; unopened -> loop = 0; printf("题目:设有n个传教士和m个野人来到河边,打算乘一只船从右岸到左岸去。\n"); printf("该船的负载能力为两人。在任何时候,如果野人人数超过传教士人数,野人\n"); printf("就会把传教士吃掉。他们怎样才能用这条船安全地把所有人都渡过河去呢-\n"); printf("\n默认的n、m值皆为3\n"); for(; ;) {printf("\n是否修改?(Y/N):"); scanf("%s",&choice); choice=toupper(choice); if(choice=='Y') {printf("\n请输入传教士人数:"); for(;;) {scanf("%d",&x); if(x>0) {unopened ->pr = x; break; } else printf("\n输入值应大于0!\n请重新输入"); } printf("请输入野人人数:"); for(;;) { scanf("%d",&x); if(x>0) {unopened -> sr = x; break; } else printf("\n输入值应大于0!\n请重新输入"); } break; } if(choice=='N') break; } }
int search( ) { int flag; struct SPQ *ntx; //提供将要扩展的结点的指针 for( ; ; ) {ntx = unopened; //从待扩展链表中提取最前面的一个 if(ntx->loop == maxloop) return 0; addtoopened(ntx); //将ntx加入已扩展链表,并将这个节点从待扩展链表中去掉