C/C++数据结构课程设计安排

C/C++数据结构课程设计安排

数据结构课程设计安排

课程设计学时:32学时
课程设计目的:综合应用数据结构课程中所学的数据结构:线性表、栈、队列、数组、广义表、树、二叉树、图、查找表中的一种或多种数据结构完成一个较大问题的求解(其实这里的问题也并不太大,所用的数据结构可能是其中的多个,也可能是其中的一个两个)。从而培养学生综合应用基本数据结构分析、解决实际问题的能力,并进一步加深对所学知识的理解和掌握。
课程设计要求:
1、课程设计以组为单位开展,每组2~4名同学,自由组合,确定组长一名。
2、每组从附件1列出的题目中任意选择其中一个完成(鼓励大家选择对你自己而言有一定挑战性的题目),每个题目最多由2组同学选做。强调独立思考,组内分工明确,每组选择的题目有本组独立完成。
3、鼓励大家参考教材上、参考书上和所选题目相关的内容和算法。不鼓励大家一拿到实验题目就去网上或参考书上找相关程序源代码,通过思考该问题并最终解决该问题不仅可以锻炼大家,提高大家的水平,而且大家对该问题的解决也会有成就感!
4、实现你所选题目要求的功能,并能够进行较完善友好的输入输出验证。
5、完成你所选的课程设计题目后,结合该题目给出设计报告(设计报告格式见课程设计报告模板),并按时上交。
6、每组同学须仔细阅读所选题目的要求,认真主动完成设计要求。有问题及时主动通过各种方式与指导教师联系沟通。同学们要发挥自主学习的能力,充分利用课外时间,安排好课程设计的时间,并在设计过程中不断检测自己的计划完成情况,及时的向教师汇报。课程设计按照教学要求需要思考、编码和上机调试程序至少32学时,代码量要求在600~3000行。
7、编写代码时请保持良好的编程的风格:
 代码段与段之间要有空行和退缩
 标识符名称应该与其代表的意义一致
 函数名之前应该添加注释说明该函数的功能
 关键代码应说明其功能
8、课程设计的考核要求按组进行答辩,本学期第17周各组上交课程设计的设计报告、程序源代码、可执行程序等,第17周进行答辩。

附件1:
数据结构课程设计可选题目

源码联系UP主 -> https://space.bilibili.com/329101171

一、运动会分数统计系统

任务:参加运动会有n个学校,学校编号为1……n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1……m,女子m+1……m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。(m<=20,n<=20)
   功能要求:1).可以输入各个项目的前三名或前五名的成绩;
   2).能统计各学校总分,
   3).可以按学校编号、学校总分、男女团体总分排序输出;
   4).可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。
   规定:输入数据形式和范围:20以内的整数(如果做得更好可以输入学校的名称,运动项目的名称)
   输出形式:有中文提示,各学校分数为整数
   界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
   存储结构:学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。(数据文件的数据读写方法等相关内容在c语言程序设计的书上,请自学解决)请在最后的上交资料中指明你用到的存储结构;
测试数据:要求使用1、全部合法数据;2、整体非法数据;3、局部非法数据。进行程序测试,以保证程序的稳定。测试数据及测试结果请在上交的资料中写明;

二、学籍信息管理

【实验目的】
综合考察数据存储、以及对各种存储结构的建立、插入、删除、排序、查找等操作。
【实验要求】
设计一个简单的学籍管理系统。包括建立、插入、修改,查找、输出、排序(按不同关键字)
【实验内容】

  1. 从学生基本信息文件读入数据以建立学籍信息。下面是一个例子:
    学号 姓名 性别 宿舍号码 电话号码
    07011001 张成成 男 501 87732111
    07011002 李成华 女 101 87723112
    07011003 王成凤 女 101 87723112
    07011004 张明明 男 502 87734333
    07011005 陈东 男 501 87732111
    每个学生信息至少包括:学号、姓名、性别。文件至少包括10个学生。
  2. 从学生成绩信息文件读入其内容建立学生的成绩信息。以下一个例子:(至少包含20项信息)
    学号 课程编号 课程名称 学分平时成绩 实验成绩 卷面成绩 综合成绩 实得学分
    07011001 A01 大学物理 3 66 78 82
    07011002 B03 高等数学 4 78 -1 90
    07011001 B03 高等数学 4 45 -1 88
    07011002 C01 VC 3 65 76 66
    功能要求极其说明:
    (1)数据录入功能:录入每个学生的学号、课程编号、课程名称、学分、平时成绩、实验成绩、卷面成绩共7个数据。实得成绩、实得学分根据条件自动运算。
    综合成绩的计算:
    a.如果本课程的实验成绩为-1,则表无实验成绩,综合成绩=平时成绩30%+卷面成绩70%
    b.如果实验成绩不为-1,表示本课程有实验成绩,综合成绩=平时成绩15%+实验成绩15%+卷面成绩70%
    实得学分的计算:采用等级学分制。
    综合成绩在90~100之间,应得学分=学分
    100%
    综合成绩在80~90之间,应得学分=学分80%
    综合成绩在70~80之间,应得学分=学分
    75%
    综合成绩在60~70之间,应得学分=学分60%
    综合成绩在60分以下,应得学分=学分
    0%
  3. 查询功能:分为学生基本情况查询和成绩查询两种
  4. 删除功能:根据输入的学生姓名或学好删除相应的学生信息。
  5. 排序功能:能实现选择按综合成绩或实得学分升序或降序排序并显示数据。

三、队列应用(用队列模拟超市交款处的顾客流)

使用一个队列模拟一队通过丹尼斯超市交款处的顾客流。为了创建这个模拟,我们必须模拟排队时间和顾客通过流。我们可以通过一个循环模拟时间,每通过一个顾客代表一定的时间间隔——例如,一分钟。我们可以使用一个队列模拟顾客流,队列中的一个数据项代表一位顾客。
为了完成这个模拟,我们需要知道顾客加入交款处队列的频率、交款结算服务情况和离开的频率。假设交款队列有以下属性。
· 每分钟有一个顾客完成交款并离开(假设此时至少有一个顾客等待服务)。
· 每分钟有零个到两个顾客加入,没有顾客到达的概率是50% , 一个顾客到达的概率是 25 % ,两个顾客到达的概率是 25 %。(如何模拟?)
我们可以使用下面的算法模拟一个时间段 n 分钟内的顾客流。
初始化队列为空。
for (minute = 0 ; minute < n ; + + minute)
{
如果队列不空,对头顾客交款并离开(即出对);
产生一个0-3范围内的随机数k;
如果k=1,一个顾客加入交款队列(入对);
如果k=2,两个顾客加入交款队列(入对);
如果k=0或3,不增加任何顾客到交款队列;
}
调用 rand ( )函数是产生伪随机数的一种简单的方法,rand函数在<stdlib.h>中。

我们的模拟程序应该在每一个模拟分钟期间内更新下列信息,即每一次通过循环。
· 完成交款服务的总顾客数
· 这些顾客花费在排队等待的时间总和
· 顾客花费在排队等待的最长时间
为了计算顾客等待的时间长度,我们需要存储“minute”,作为这个客户队列数据项的一部分,表示顾客加入的时间。
如果你使用程序模拟一列顾客流,试着完成下面的表格。请注意,平均等待时间是等待时间总和除以总的服务顾客数。
时间(分钟) 总的顾客服务时间 平均等待时间 最长等待时间
30
60
120
480

四、栈对队列的模拟问题

问题描述:用两个栈模拟一个队列,栈的基本操作包括Push、Pop、StackEmpty,需要实现队列的基本操作。即以两个栈的存储空间,作为队列的存储空间;以栈的基本操作模拟实现队列的基本操作。
基本要求:(1)借用两个栈模拟一个队列;(2)设计队列的基本操作:入队、出队、队元素显示;(3)以菜单形式提供基本操作选项;(4)输出:各种基本操作演示结果。
实现提示:
(1) 栈的特点是先入后出,队列的特点是先入先出。所以,用两个栈S1和S2模拟一个队列时,即要利用栈的“先入后出”实现“先入先出”。
(2) 入队。入队分以下三种情况:1)S1未满时,入队元素入S1栈;2)S1满时,S2空时,首先将S1的元素出站至S2;然后入队元素入S1栈;3)S1满、S2不空,不能入队。
(3) 出队。出队分以下三种情况:1)S2不空时,用S2出栈,模拟出队;2)S1不空S2空时,首先将S1中所有元素出栈至S2中,然后S2出栈;3)S1和S2均空时,不能出队。
测试与运行
(1) 栈S1和S2等长,均为4,运行下列基本操作,并写出操作结果:1)创建一个空队,并测队空;2)A、B、C入队,显示队元素;3)A出队,显示队元素;4)D、E、F、G入队,显示队元素;5)B、C出队,显示队元素;6)H、I入队,显示队元素;7)K入队;8)所有元素出队,测队空。
(2) 分析运行结果的正确性,并据此修改与完善程序。
思考
(1) 何为队空?何为队满?
(2) 如何计算队长?为什么S1满、S2不空时不能入队?

五、数据压缩

【实验目的】
1)调研数据压缩原理与相关算法的实现;
2)实现一个压缩/解压缩程序
【实验要求】

  1. 阅读相关资料,理解数据压缩的意义和过程。
  2. 调研几个著名的数据压缩算法,写一份调研报告,说明其算法及所使用的数据结构。
  3. 实现一个压缩/解压缩程序,算法任意。
  4. 程序要求:
    控制台界面。
    首先实现对单文件压缩的功能。
    命令行格式:
    压缩: 程序名 -c 输入文件 [输出文件名]
    解压缩: 程序名 -d 输入文件 [输出文件名]
    []里内容表示可选。
    控制台输出:
    压缩: 原始文件大小、压缩后文件大小、压缩比例、消耗时间
    解压缩: 解压前文件大小,解压后文件大小、压缩比例、消耗时间
    选做:1)将多个文件压缩到一个文件;2)检查压缩文件完整性,测试其能够完成解压缩;3)对文件测试,不压缩,输入其若压缩后的压缩率;4)列出压缩文件内所包含的文件名;4)实现对整个目录进行压缩的功能。
    文件格式:对压缩文件起一个后缀名。若在命令行中没指定输入文件的话,输出文件名应该是 输入文件名+.后缀名 的格式;若在命令行中指定输出文件名的话,后缀也应自动加上。
    实现的压缩比例越高、压缩时间越短越好。

六、迷宫问题。

利用栈结构实现迷宫求解问题。迷宫求解问题如下:
心理学家把一只老鼠从一个无顶盖的大盒子的入口赶进迷宫,迷宫中设置很多隔壁,对前进方向形成了多处障碍,心理学家在迷宫的唯一出口放置了一块奶酪,吸引老鼠在迷宫中寻找通路以到达出口,测试算法的迷宫如下图所示。
提示:1、可以使用递归或非递归两种方法实现
2、老鼠能够记住已经走过的路,不会反复走重复的路径
3、可以自己任意设置迷宫的大小和障碍
4、使用“穷举求解”的方法

六、迷宫问题。

传说在远古时候,米诺斯国王统治着爱琴海南端的克里特岛。他建造了一座有无数宫室的迷宫,在迷宫中喂养了一头人身牛头的恶兽——米诺牛。为了供奉它,米诺斯要希腊的雅典每九年进贡七对童男女喂米诺牛。当时,雅典有位名叫忒休斯的王子,他不忍人民遭受这种灾难,毅然决定跟随第四批被进贡的童男女去克里特杀死米诺牛。在克里特,英勇的忒休斯赢得了米诺斯的女儿的爱慕。她交给忒休斯一个线团,让他按下面规则边走边放线:
(1)每到一个岔口,找没有铺上线的路走;若找不到未铺上线的路,就沿原来的路返回到前一个岔口。
(2)不走已铺上两条线的路。
用这种方法,忒休斯终于杀死米诺牛,胜利的走出迷宫。

七、学生数据结构成绩管理系统

[基本要求]
(1)学生信息及成绩的录入
要求包括的学生信息有:学号、姓名、性别、出生日期、民族及数据结构成绩(具体内容可自行假设,至少录入10名以上学生)
所录入的学生按学号散列存储(散列函数为:学号%5 取整,如 1002%5 =2),采用拉链法解决冲突。
(2)学生成绩的查询
要求根据提供的学号完成学生成绩的查询(必须采用哈希查找)
(3)学生成绩的分段统计和排序输出
统计出各分数段学生人数(60分以下,6070,7180,…)
采用任何一种排序方法,将学生成绩从高到低排序输出

八、哈希表应用

[问题描述]
针对某个集体中人名设计一个哈希表,使得平均查找长度不超过R,并完成相应的建表和查表程序。
[基本要求]
假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有300个,取平均查找长度的上限为2。哈希函数用除留余数法构造,用线性探测再散列法或链地址法处理冲突。[测试数据]
取读者周围较熟悉的300个人名。
[选作内容]
(1) 从教科书上介绍的集中哈希函数构造方法中选出适用者并设计几个不同的哈希函数,比较他们的地址冲突率(可以用更大的名字集进行实验)。
(2) 研究这300个人名的特点,努力找一个哈希函数,使得对于不同的拼音名一定不发生地址冲突。
(3) 在哈希函数确定的前提下尝试各种不同处理冲突的方法,考察平均查找长度的变化和造好的哈希表中关键字的聚集性。

九、内部排序算法比较

[问题描述]
各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间。试通过随机的数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受。
[基本要求]
(1) 对以下10种常用的内部排序算法任意选择6种进行比较:直接插入排序;折半折入排序;二路插入排序;希尔排序;起泡排序;快速排序;简单选择排序;堆排序;归并排序;基数排序。
(2) 待排序表的表长不小于100;其中的数据要用伪随机数产生程序产生;至少要用5组不同的输入数据作比较;比较的指标为有关键字参加的比较次数和关键字移动次数(关键字交换计为3次移动)。
[测试数据]
由随机产生器决定。
[实现提示]
主要工作是设法在程序中适当的地方插入计数操作。程序还可以包括计算几组数据得出结果波动大小的解释。注意分块调试的方法。

十、校园导游程序

[问题描述]
用无向网表示安阳师范学院校园景点或建筑物平面图,图中顶点表示主要景点或建筑物,存放景点的编号、名称、简介等信息,图中的边表示景点间的道路,存放路径长度等信息。要求能够回答有关景点介绍、游览路径等问题。
[基本要求]
(1) 查询各景点的相关信息;
(2) 查询图中任意两个景点间的最短路径。
(3) 查询图中任意两个景点间的所有路径。
(4) 增加、删除、更新有关景点和道路的信息。
(5) 求多个景点的最佳(最短)游览路径。

十一、实现第7章图中的部分算法,这些算法至少包括以下5组中的两组:

(1) 深度和广度优先搜索遍历图;
(2) 构造最小生成树的两种算法
(3) 拓扑排序算法;
(4) 求解关键路径;
(5) 求解最短路径。

十二、合理设计手机键盘

【题意描述】
我们的手机键盘上将26个字母如下左图设置在8个键盘上,但每个字母的按键频率是不同的,因此如果按照右图的方式设置字母在键盘上的相对位置可能会使所有字母的按键频率与按键次数乘积之和达到最小,从而更加方便客户使用。我们的任务是根据输入的键盘数和字符数及每个字符的使用频率来确定最合理的分配方式,使分配后所有字符的频率和按键次数的乘积之和最小。在每个键盘上,处于第i个位置上的字符按键次数为i,在分配的过程中我们不能更改字符的相对位置。

该题目详细描述如下:
I-Keyboard
Time Limit: 2000MS Memory Limit: 32768K
Total Submissions: 3235 Accepted: 1690
Description
Most of you have probably tried to type an SMS message on the keypad of a cellular phone. It is sometimes very annoying to write longer messages, because one key must be usually pressed several times to produce a single letter. It is due to a low number of keys on the keypad. Typical phone has twelve keys only (and maybe some other control keys that are not used for typing). Moreover, only eight keys are used for typing 26 letters of an English alphabet. The standard assignment of letters on the keypad is shown in the left picture:

1
 	2
abc	3
def
4
ghi	5
jkl	6
mno
7
pqrs	8
tuv	9
wxyz
*
 	0
space	#
 
	      	1
 	2
abcd	3
efg
4
hijk	5
lm	6
nopq
7
rs	8
tuv	9
wxyz
*
 	0
space	#

There are 3 or 4 letters assigned to each key. If you want the first letter of any group, you press that key once. If you want the second letter, you have to press the key twice. For other letters, the key must be pressed three or four times. The authors of the keyboard did not try to optimise the layout for minimal number of keystrokes. Instead, they preferred the even distribution of letters among the keys. Unfortunately, some letters are more frequent than others. Some of these frequent letters are placed on the third or even fourth place on the standard keyboard. For example, S is a very common letter in an English alphabet, and we need four keystrokes to type it. If the assignment of characters was like in the right picture, the keyboard would be much more comfortable for typing average English texts.

ACM have decided to put an optimised version of the keyboard on its new cellular phone. Now they need a computer program that will find an optimal layout for the given letter frequency. We need to preserve alphabetical order of letters, because the user would be confused if the letters were mixed. But we can assign any number of letters to a single key.
Input
There is a single positive integer T on the first line of input. It stands for the number of test cases to follow. Each test case begins with a line containing two integers K, L (1 <= K <= L <= 90) separated by a single space. K is the number of keys, L is the number of letters to be mapped onto those keys. Then there are two lines. The first one contains exactly K characters each representing a name of one key. The second line contains exactly L characters representing names of letters of an alphabet. Keys and letters are represented by digits, letters (which are case-sensitive), or any punctuation characters (ASCII code between 33 and 126 inclusively). No two keys have the same character, no two letters are the same. However, the name of a letter can be used also as a name for a key.

After those two lines, there are exactly L lines each containing exactly one positive integer F1, F2, … FL. These numbers determine the frequency of every letter, starting with the first one and continuing with the others sequentially. The higher number means the more common letter. No frequency will be higher than 100000.
Output
Find an optimal keyboard for each test case. Optimal keyboard is such that has the lowest “price” for typing average text. The price is determined as the sum of the prices of each letter. The price of a letter is a product of the letter frequency (Fi) and its position on the key. The order of letters cannot be changed, they must be grouped in the given order.

If there are more solutions with the same price, we will try to maximise the number of letters assigned to the last key, then to the one before the last one etc.

More formally, you are to find a sequence P1, P2, … PL representing the position of every letter on a particular key. The sequence must meet following conditions:

P1 = 1
for each i>1, either Pi = Pi-1+1 or Pi = 1
there are at most K numbers Pi such that Pi = 1
the sum of products SP = F1P1+F2P2+…+FL*PL is minimal
for any other sequence Q meeting these criteria and with the same sum SQ = SP, there exists such M, 1 <= M <= L that for any J, M < J <= L, PJ = QJ, and PM > QM.
The output for every test case must start with a single line saying Keypad #I:, where I is a sequential order of the test case, starting with 1. Then there must be exactly K lines, each representing one letter, in the same order that was used in input. Each line must contain the character representing the key, a colon, one space and a list of letters assigned to that particular key. Letters are not separated from each other.

Print one blank line after each test case, including the last one.
Sample Input
1
8 26
23456789
ABCDEFGHIJKLMNOPQRSTUVWXYZ
3371
589
1575
1614
6212
971
773
1904
2989
123
209
1588
1513
2996
3269
1080
121
2726
3083
4368
1334
518
752
427
733
871
Sample Output
Keypad #1:
2: ABCD
3: EFG
4: HIJK
5: LM
6: NOPQ
7: RS
8: TUV
9: WXYZ

十三、二叉排序树的应用(基于二叉排序树的个人通信录)

在日常生活中,个人通信录是我们不可少的,不管是纸式的个人通信录 还是我们手机中的个人通信录,查寻是其最基本的操作,几乎所有的操作都是在查寻的基础上进行的,所以,查寻时间的快慢很大程度上决定了整个通信录的性能。所以,一个有着良好界面、查寻速快的通信录,是人们所追求的。
本设计应用折半查寻法 的技术思想进行查寻,从本思想出发,可以有两种数据组织方式:一是应用链表进行组织数据,由于折半查寻法的特殊性,所要进行查寻的数据列必须是有序的数据列,这样要求对数据列进行排序。出于系统实时查寻的考虑,每次对通信录进行改变后都得进行重新排序,这样才能保证数据列是实时有序的。这样当操作量大时,排序所消耗的时间对整个系统有很大的影响。
二是应用二叉排序树来组织数据,由于二叉排序树是应用折半查寻法思想进行对数据进行存储的,所以,其左孩子大于双亲结点、右孩子小于双亲结点(或者左孩子小于双亲结点、右孩子大于双亲结点),这样就可以应用折半查寻法的思想进行查寻,从而减少对排序时所消耗的时间。
本设计采用第二种方法,即应用二叉排序树进行组织数据,在此基础上进行对个人通信录的各种操作。由于删除操作是本设计的重点,删除操作的成功与否直接影响到整个系统的成败,所以在此进行详细分析一下删除操作的实现。
此功能函数主要应用于删除将要进行删除的记录,此操作较其它几个操作难一点,同时也是此次设计的重点,所以,本函数的成败可以直接影响到本次设计的成败,同时,在进行二叉排序树进行组织时,如果不从系统的整体进行考虑,只想到简单地实现删除功能,将会出现错误。
在设计初期,由于没有考虑所有可能的情况,所以在进行删除最后一个结点时,总会出现内存不能引用的错误。最后想到应用浪费一个结点空间的技术进行处理此问题,就是根结点用来保存二叉排序树的某些信息,而不保存记录,与我们单链表中的头结点一样,这样做解决了上面所说的问题,同时在进行查寻双亲结点时也带来了很大的方便。
有关二叉排序树的删除的有关问题,请读者参考相关的参考文献 ,在此不再进行说明,本节重点在于说明本课程设计中有关删除的问题。
在本设计中,删除的首要条件是找到将要进行删除结点的双亲结点,由于根结点不用于存储记录,所以,可以不用进行判断根结点的情况,进行查寻双亲结点时,从根结点开始,首先进行判断根结点的左右子树是否为空,如果根结点的左右子树为空,则返回 NULL ,如果根结点的左子树(右子树)不为空,则将其左子树(右子树)的记录的学号与将要进行删除的学号进行比较,如果相等,则返回根结点;否则进行比较,如果左子树(右子树)不为空,且左子树(右子树)的学号大于(小于)要进行删除的学号,则进行递归在左子树(右子树)中进行查寻,直到查寻到或者当前结点的左右子树为空时结束。如果当前结点的学号与要进行删除的学号不相等,且当前结点的左右子树为空,则返回空,结束查寻过程。
经过对双亲结点的查寻,如果没有此记录,则进行提示,否则进行删除操作 [1] [5] ,在进行删除时,有以下几种可能,以下操作中假设每次把要进行删除结点进行删除后,同时也释放了此结点所占用的内存空间,防止内存在运行过程中丢失。
第一:要进行删除的结点为叶结点,直接把其从二叉排序树中进行删除。
第二:此结点只有左子树或者右子树,这种情况下只需将只需把此结点的左子树或者右子树替换为双亲结点的左子树。
第三:此结点有左子树同时有也右子树,此种操作比较复杂,其中有两种方法进行删除,本课程设计中应用的方法是从某子树中找出一个结点(假设为 Temp ),将其值代替要进行删除结点的值,再把 Temp 结点进行删除。

十四、DNA分子的最佳比对

问题描述:
DNA分子是人类遗传信息的载体,它间接地指导蛋白质的合成。DNA分子是由四种核苷酸组成的长链,这四种核苷酸分别是腺嘌呤核苷酸(用A代表)、鸟嘌呤核苷酸(用G代表)、胞嘧啶核苷酸(用C代表)和胸腺嘧啶核苷酸(用T代表)。习惯上用一个字符集为{A,T,C,G}的字符串来表示一个DNA分子序列,如CGTTAGA。
在生物进化过程中,DNA分子可能发生各种各样的突变。这种突变形成了生物遗传信息的改变,从而使生物得以分化,构成了生物的多样性。主要的突变有三种:(1)在一个DNA序列中插入一个新的核苷酸,(2)DNA序列中丢失了一个核苷酸,(3)DNA序列中的某个核苷酸被另一个核苷酸所取代。
所谓两个DNA序列的一个比对是寻找一种排列方式,使得两个DNA序列在同样的位置上有相同的核苷酸,而若在同样的位置上两个DNA序列的核苷酸不同,则是由三种突变之一得到。例如,对两个DNA序列T =ATCAG,T =ACTAG,可以按如下方式比对,
比对1:
T T
A A
T – (“–”表示空白)
C C
– T
A A
G G

也可以按如下方式比对
比对2:
T T
A A
T C
C T
A A
G G

如果两个DNA序列在相同的位置上有越多相同的核苷酸对,则表明它们之间越相似,即它们存在功能上的相似性和进化史上的亲缘关系。
对于两个DNA序列的一个比对,规定如下得分方式:(1)一个同样的位置上有相同的核苷酸对,则可得1分;(2)一个同样的位置上有不同的核苷酸对,则得0分;(3)如果在某个位置上一个序列有核苷酸,而另一个序列在该位置上为“–”,则得-2分。例如,比对1的得分是0分,比对2的得分是3分。

编程任务:
对于两个DNA序列,寻找一种比对方式,使得它们的得分最高。

数据输入:
输入数据由文件名为INPUT3.*的文本文件提供,共有2行。
第1行为DNA序列T , 第2行为DNA序列T 。序列的长度不大于5000。序列中的字母是英文小写或者大写字母。

结果输出:
程序运行结束时,在屏幕上输出两个DNA序列比对的最高得分。

输入文件示例 输出示例
INPUT3.001

Atcag
Actag 3

Human Gene Functions
Time Limit:1000MS Memory Limit:10000K
Total Submit:2255 Accepted:1440
Description
It is well known that a human gene can be considered as a sequence, consisting of four nucleotides, which are simply denoted by four letters, A, C, G, and T. Biologists have been interested in identifying human genes and determining their functions, because these can be used to diagnose human diseases and to design new drugs for them.

A human gene can be identified through a series of time-consuming biological experiments, often with the help of computer programs. Once a sequence of a gene is obtained, the next job is to determine its function.
One of the methods for biologists to use in determining the function of a new gene sequence that they have just identified is to search a database with the new gene as a query. The database to be searched stores many gene sequences and their functions – many researchers have been submitting their genes and functions to the database and the database is freely accessible through the Internet.

A database search will return a list of gene sequences from the database that are similar to the query gene.
Biologists assume that sequence similarity often implies functional similarity. So, the function of the new gene might be one of the functions that the genes from the list have. To exactly determine which one is the right one another series of biological experiments will be needed.

Your job is to make a program that compares two genes and determines their similarity as explained below. Your program may be used as a part of the database search if you can provide an efficient one.
Given two genes AGTGATG and GTTAG, how similar are they? One of the methods to measure the similarity
of two genes is called alignment. In an alignment, spaces are inserted, if necessary, in appropriate positions of
the genes to make them equally long and score the resulting genes according to a scoring matrix.

For example, one space is inserted into AGTGATG to result in AGTGAT-G, and three spaces are inserted into GTTAG to result in –GT–TAG. A space is denoted by a minus sign (-). The two genes are now of equal
length. These two strings are aligned:

AGTGAT-G
-GT–TAG

In this alignment, there are four matches, namely, G in the second position, T in the third, T in the sixth, and G in the eighth. Each pair of aligned characters is assigned a score according to the following scoring matrix.

denotes that a space-space match is not allowed. The score of the alignment above is (-3)+5+5+(-2)+(-3)+5+(-3)+5=9.

Of course, many other alignments are possible. One is shown below (a different number of spaces are inserted into different positions):

AGTGATG
-GTTA-G

This alignment gives a score of (-3)+5+5+(-2)+5+(-1) +5=14. So, this one is better than the previous one. As a matter of fact, this one is optimal since no other alignment can have a higher score. So, it is said that the
similarity of the two genes is 14.
Input
The input consists of T test cases. The number of test cases ) (T is given in the first line of the input file. Each test case consists of two lines: each line contains an integer, the length of a gene, followed by a gene sequence. The length of each gene sequence is at least one and does not exceed 100.
Output
The output should print the similarity of each test case, one per line.
Sample Input
2
7 AGTGATG
5 GTTAG
7 AGCTATT
9 AGCTTTAAA
Sample Output
14
21
Source
Taejon 2001

十五、二叉树的相关算法实现

编程实现二叉树的创建、遍历(递归算法和非递归算法都要实现)、线索化、线索化二叉树的遍历等操作,要求有较好的菜单界面,人机交互方便友好,能够进行简单的输入输出验证等。

十六、图的实现

问题描述:对于如下地图,实现图的基本算法。
基本要求:
1以邻接表作交通图的存储结构,表示该图。
2 求出该图的最小生成树
3 针对用户所输入的两个城市、求出其最小距离,并输出所经历的城市及总距离。

十七、 约瑟夫双向生死游戏

1 项目简介
约瑟夫双向生死游戏是在约瑟夫生者死者游戏的基础上,正向计数后反向计数,然后再正向计数。具体描述如下:30个旅客同乘一条船,因为严重超载,加上风高浪大,危险万分;因此船长告诉乘客,只有将全船一半的旅客投入海中,其余人才能幸免遇难。无奈,大家只得同意这种办法,并议定30个人围成一圈,由第一个人开始,顺时针依次报数,数到第9人,便把他投入大海中,然后从他的下一个人数起,逆时针数到第5人,将他投入大海,然后从他逆时针的下一个人数起,顺时针数到第9人,再将他投入大海,如此循环,直到剩下15个乘客为止。问哪些位置是将被扔下大海的位置。
2 设计思路
本游戏的数学建模如下:假设n个旅客排成一个环形,依次顺序编号1,2,…,n。从某个指定的第1号开始,沿环计数,数到第m个人就让其出列,然后从第m+1个人反向计数到m-k+1个人,让其出列,然后从m-k个人开始重新正向沿环计数,再数m个人后让其出列,然后再反向数k 个人后让其出列。这个过程一直进行到剩下q个旅客为止。
本游戏的要求用户输入的内容包括:

  1. 旅客的个数,也就是n的值;
  2. 正向离开旅客的间隔数,也就是m的值;
  3. 反向离开旅客的间隔数,也就是k的值;
  4. 所有旅客的序号作为一组数据要求存放在某种数据结构中。
    3 本游戏要求输出的内容是包括
  5. 离开旅客的序号;
  6. 剩余旅客的序号;
    所以,根据上面的模型分析及输入输出参数分析,可以定义一种数据结构后进行算法实现。
    4 数据结构
    约瑟夫双向生死游戏如果用单循环链表作为线性存储结构,就只能正向计数结点,反向计数比较困难,算法较为复杂,而且效率低。用双向循环链表解决这一问题,实现的方法相对要简单得多。
    为了不失一般性,将30改为一个任意输入的正整数n,而正向报数上限(原为9)也为一个任选的正整数m,正向报数上限(原为5)也为一个任选的正整数k,。这样该算法描述如下:
    (1) 创建含有n个结点的双向循环链表;
    (2) 生着与死者的选择:
    p指向链表的第一个结点,初始i置为1;
    while(i<=n/2) //删除一半的结点
    { 从p指向的结点沿链前进m-1步;
    删除第m个结点(q所指向的结点);
    p指向q的下一个结点;
    输出其位置q->data;
    i自增1;
    从p指向的结点沿链后退k-1步;
    删除第k个结点(q所指向的结点);
    p指向q的上一个结点;
    输出其位置q->data;
    i自增1;

    (3) 输出所有生者的位置。

十八、 导航最短路径查询

1 项目简介
设计一个交通咨询系统,能让旅客咨询从任一个城市顶点到另一个城市顶点之间的最短路径问题。设计分三个部分,一是建立交通网络图的存储结构;二是解决单源最短路径问题;最后再实现两个城市顶点之间的最短路径问题。
最短路径问题的提出随着计算机的普及以及地理信息科学的发展,GIS因其强大的功能得到日益广泛和深入的应用。网络分析作为GIS最主要的功能之一,在电子导航、交通旅游、城市规划以及电力、通讯等各种管网、管线的布局设计中发挥了重要的作用。而网络分析中最基本和关键的问题是最短路径问题。
最短路径不仅仅指一般地理意义上的距离最短,还可以引申到其他的度量,如时间、费用、线路容量等。相应地,最短路径问题就成为最快路径问题、最低费用问题等。由于最短路径问题在实际中常用于汽车导航系统以及各种应急系统等(110报警、119火警以及医疗救护系统),这些系统一般要求计算出到出事地点的最佳路线的时间一般在1s-3s,在行车过程中还需要实时计算出车辆前方的行驶路线,这就决定了最短路径问题的实现应该是高效率的。最优路径问题不仅包括最短路径问题,还有可能涉及到最少时间问题、最少收费(存在收费公路)问题、或者是几个问题的综合,这时将必须考虑道路级别、道路流量、道路穿越代价(如红灯平均等待时间)等诸多因素。但是必须指出的是,一般来说最优路径在距离上应该是最短的,但最短路径在行驶时间和能源消耗的意义上未必是最优的。其实,无论是距离最短、时间最快还是费用最低,它们的核心算法都是最短路径算法。
2 设计思路
单源最短路径算法的主要代表之一是Dijkstra(迪杰斯特拉)算法。该算法是目前多数系统解决最短路径问题采用的理论基础,在每一步都选择局部最优解,以期望产生一个全局最优解。
Dijksira算法的基本思路是:对于图G=(V,E),V是包含n个顶点的顶点集,E是包含m条弧的弧集,(v, w)是E中从v到w的弧,c(v, w)是弧(v, w)的非负权值,设s为V中的顶点,t为V中可由s到达的顶点,则求解从s至t的具有最小弧权值和的最短路径搜索过程如下:
(1) 将v中的顶点分为3类:已标记点、未标记点、己扫描点。将s初始化为己标记点,其它顶点为未标记点。为每个顶点v都建立一个权值d和后向顶点指针p,并将d初始化如下:d(v)=0,v=s;d(v)=∞,v≠s。
(2) 重复进行扫描操作:从所有已标记点中选择一个具有最小权值的顶点v并将其设为己扫描点,然后检测每个以v为顶点的弧(v, w),若满足d(v) + c(v, w) < d(w) 则将顶点v设为已标记点,并令d(w) = d(v) + c(v, w), p(w) = v。
(3) 若终点t被设为已扫描点,则搜索结束。由t开始遍历后向顶点指针P直至起点s,即获得最短路径解。
3 数据结构
(1)定义一个数组min_dist,它的每个数组元素min_dist[i]表示当前所找到的从始点vi到每个终点vj的最短路径的长度。它的初态为:若从vi到vj有边,则min_dist[j]为边的权值;否则置min_dist[i]为∞。定义一个数组path,其元素path[k](0≤k≤n-1)用以记录vi到vk最短路径中vk的直接前驱结点序号,如果vi到vk存在边,则path[k]初值为i。定义一个数组W,存储任意两点之间边的权值。
  (2)查找min(min_dist[j],j∈V-S),设min_dist[k]最小,将k加入S中。修改对于V-S 中的任一点vj,min_dist[j]=min(min_dist[k]+w[k][j], min_dist[j]) 且path[j]=k。
  (3)重复上一步,直到V-S为空。
  在算法设计时,用一个tag数组来记录某个顶点是否已计算过最短距离,如果tag[k]=0,则vk∈V-S,否则vk∈S。初始值除tag[i]=1以外,所有值均为0。

十九、微博感兴趣用户推荐功能的实现

1 项目简介
互联网推荐系统在商品推销、电子商务、志趣相投等方面广泛应用。其中微博系统中最简单的推荐功能是推荐当前用户可能感兴趣的人,推荐的人可以是当前人气用户,也可以是和他有相同兴趣的用户,其中一种最简单的方法是通过和你有共同好友的方法进行的计算。其抽象出的模型将是一个图,结点是用户,边表示关注。本项目要求编程实现微博中的推荐功能。

二十、从人名判定性别系统的实现

1 项目简介
本课题是统计语言模型的一个典型应用,试图模拟人类从人名判别性别的过程。本系统要求采用最简单的贝叶斯分类器实现如下功能:根据用户输入的一个人名,给出该人的性别判定。问题最终可以抽象为一个有向图模型。

二十一、背包问题求解

组合优化问题的求解方法研究已经成为了当前众多科学关注的焦点,这不仅在于其内在的复杂性有着重要的理论价值,同时也在于它们能在现实生活中广泛的应用。比如资源分配、投资决策、装载设计、公交车调度等一系列的问题都可以归结到组合优化问题中来。但是,往往由于问题的计算量远远超出了计算机在有效时间内的计算能力,使问题的求解变为异常的困难。尤其对于NP完全问题,如何求解其最优解或是近似最优解便成为科学的焦点之一。背包问题是一个典型的组合优化问题,在计算理论中属于NP-完全问题, 其计算复杂度为 ,传统上采用动态规划来求解。设w[i]是经营活动 i 所需要的资源消耗,M是所能提供的资源总量,p[i]是人们经营活动i得到的利润或收益,则背包问题就是在资源有限的条件下, 追求总的最大收益的资源有效分配问题。
假设有一个能装入总体积为T的背包和n件体积分别为w1 , w2 , … , wn 的物品,能否从n件物品中挑选若干件恰好装满背包,即使w1 +w2 + … + wn=T,要求找出所有满足上述条件的解。例如:当T=10,各件物品的体积{1,8,4,3,5,2}时,可找到下列4组解:
(1,4,3,2)
(1,4,5)
(8,2)
(3,5,2)
该问题的模型可以表示为下述0/1整数规划模型:
目标函数:
(*)
式中 为0-1决策变量, 时表示将物品 装入背包中, 时则表示不将其装入背包中。

二十二、线性表的链式存储结构的实现

根据线性表的抽象数据类型的定义,选择下面任两种链式结构实现线性表,并完成线性表的基本功能。
线性表存储结构(四选二):
1、 带头结点的单链表
2、 循环链表
3、 双向链表
4、 静态链表
线性表的基本功能:
1、 构造:使用头插法、尾插法两种方法
2、 插入:要求建立的链表按照关键字从小到大有序
3、 删除
4、 查找
5、 获取链表长度
6、 销毁
7、 其他:可自行定义
编写测试main()函数测试线性表的正确性。

二十三、通讯录的管理

利用线性表实现一个通讯录管理,通信录的数据格式如下:
struct DataType
{
int ID; //编号
char name[10]; //姓名
char ch; //性别
char phone[13]; //电话
char addr[31]; //地址
};
要求:
 实现通讯录的建立、增加、删除、修改、查询等功能
 能够实现简单的菜单交互,即可以根据用户输入的命令,选择不同的操作。
 能够保存每次更新的数据(选作)
 能够进行通讯录分类,比如班级类、好友类、黑名单等等(选作)
编写测试main()函数测试线性表的正确性

二十四、二叉树的实现及应用

【实验目的】
通过实现下面两个内容,掌握如下内容:
 掌握二叉树基本操作的实现方法
 了解赫夫曼树的思想和相关概念
 学习使用二叉树解决实际问题的能力
【实验内容】
(一)内容1
根据二叉树的抽象数据类型的定义,使用二叉链表实现一个二叉树。
二叉树的基本功能:
1、二叉树的建立
2、前序遍历二叉树
3、中序遍历二叉树
4、后序遍历二叉树
5、按层序遍历二叉树
6、求二叉树的深度
7、求指定结点到根的路径
8、二叉树的销毁
9、其他:自定义操作
10、能够测试二叉树的正确性

(二)内容2
利用二叉树结构实现赫夫曼编/解码器。
基本要求:
1、 初始化(Init):能够对输入的任意长度的字符串s进行统计,统计每个字符的频度,并建立赫夫曼树
2、 建立编码表(CreateTable):利用已经建好的赫夫曼树进行编码,并将每个字符的编码输出。
3、 编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的字符串输出。
4、 译码(Decoding):利用已经建好的赫夫曼树对编码后的字符串进行译码,并输出译码结果。
5、 打印(Print):以直观的方式打印赫夫曼树(选作)
6、 计算输入的字符串编码前和编码后的长度,并进行分析,讨论赫夫曼编码的压缩效果。

测试数据:
I love data Structure, I love Computer. I will try my best to study data Structure.
提示:
1、用户界面可以设计为“菜单”方式:能够进行交互。
2、根据输入的字符串中每个字符出现的次数统计频度,对没有出现的
字符一律不用编码。

源码联系UP主 -> https://space.bilibili.com/329101171

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值