《数据结构与算法》课程设计Word文档格式.docx
- 文档编号:17823387
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:42
- 大小:218.23KB
《数据结构与算法》课程设计Word文档格式.docx
《《数据结构与算法》课程设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《《数据结构与算法》课程设计Word文档格式.docx(42页珍藏版)》请在冰豆网上搜索。
*current=first;
if(current)
{
inti=0;
Tx;
cout<
<
current->
data<
"
"
;
i++;
Delete(i,x);
SeqOutput();
}
else
cout<
endl;
/*cout<
Listsequencesequenceoutputover!
*/
}
//逆序输出
template<
classT>
OpSeqOutput(intn)
*trail;
if(first&
&
n>
0)
for(inti=0;
current&
i<
n;
i++)
{
trail=current;
current=current->
link;
}
trail->
OpSeqOutput(n-1);
/*cout<
Listsequencereverseoutputover!
实习二
2、二值图像的像元分组
算法简介:
二值图像中每个元素的值只能为1或0,其中1表示有效像元,0表示图像的背景。
如果一个元素在另外一个元素的上、下、左、右四个方向,称两个元素为相邻元素。
“像元分组”算法是将二值图像中处于相邻的元素进行分组标号,使得属于同一个分组的像元集合,其编号都相同。
如下图所示:
1
2
3
分组前分组后
使用“队列”来实现二值图像的像元分组,图像数据采用TXT文件形式给出,把分组结果图像输出到另外一个文件
利用队列的存储结构;
数字化图像是一个m*n的像素矩阵。
识别图元就是对元像素进行标记,当且仅当两个像素属于同一图元时,它们的标号相同;
在识别图元的过程中,图像的周围包上一圈空白像素(即0像素);
采用数组0offset来确定与一个给定像素相邻的像素。
通过逐行扫描像素来识别图元。
当遇到一个没有标号的图元的像素时,就给它指定一个图元编号(使用数字2、3、等为图元编号),该像素就为一个新图元种子,通过识别和标记与种子相邻的所有图元像素,可以确定图元中的其它像素。
先在图像外围包上一圈背景像素,并对offset进行初始化,接下来的两个for循环通过扫描图像寻找下一个图元的种子。
再图元标号设置为种子标号,接下来借助于链表队列的帮助,可以识别出该图元的其余像素。
10
9
111100000000000000
000000111000000222
000000000000000000
001111100003333300
000011100000033300
110000000040000000
000001110000005550
011100000066600000
000001000000007000
000111010000777080
对于任一个图元来说,识别标记该图元的的每个像素(种子除外)所需时间为O(cnum),识别并标记所有非种子图元像素所需要的总时间为O(m2)。
其存储方式可以用公式化队列,链表堆栈,或公式化堆栈。
#include"
stdafx.h"
Disgra.h"
#include<
iostream>
fstream>
usingnamespacestd;
#definemax40
int_tmain(intargc,_TCHAR*argv[])
ifstreamf1("
data.txt"
ios:
_Nocreate);
DisgraD;
//创建Disgra的对象D
D.pixel;
introws(0),cols(0);
f1>
>
rows>
cols;
//读入行数和列数
intn(0);
for(inti=0;
rows;
for(intj=0;
j<
j++)
f1>
//读入像元数据,并存入pixel[][]数组
D.pixel[i][j]=n;
f1.close();
D.Lable(rows,cols);
//调用函数Lable
ofstreamf2("
data2.txt"
out);
intl(0);
//计数
l++;
f2<
D.pixel[i][j]<
//输出被标记的像元
if(l==9)
{
f2<
l=0;
}
f2.close();
return0;
#ifndefDisgra_
#defineDisgra_
positoin.h"
lqueue.h"
#defineMAXSIZE50
structDisgra
intpixel[MAXSIZE][MAXSIZE];
//存储数据的二维数组
voidLable(introws,intcols);
//标记函数
};
voidDisgra:
Lable(introws,intcols)
/*intpixel[MAXSIZE][MAXSIZE];
/*introws(0),cols(0);
=cols;
pixel[0][i]=pixel[rows+1][i]=0;
pixel[i][0]=pixel[i][cols+1]=0;
Positionoffset[4];
offset[0].row=0;
offset[0].col=1;
offset[1].row=1;
offset[1].col=0;
offset[2].row=0;
offset[2].col=-1;
offset[3].row=-1;
offset[3].col=0;
intNumOfNbrs=4;
LinkedQueue<
Position>
Q;
intid=1;
Positionhere,nbr;
for(intr=1;
r<
=rows;
r++)
for(intc=1;
c<
c++)
if(pixel[r][c]==1)
pixel[r][c]=++id;
here.row=r;
here.col=c;
do{
for(inti=0;
NumOfNbrs;
{
nbr.row=here.row+offset[i].row;
nbr.col=here.col+offset[i].col;
if(pixel[nbr.row][nbr.col]==1)
{
pixel[nbr.row][nbr.col]=id;
Q.Add(nbr);
}
}
if(Q.IsEmpty())break;
Q.Delete(here);
}while(true);
#endif
实习三
3、课程安排问题
一套好的课程体系有如下要求:
各个课程之间有着严格的先后顺序关系;
两个相邻课程之间的跨度为一个时间段(具体就是一个学期)。
课程安排问题,是为了验证专业课程安排方案是否合理,并提供多种选课方案供学生进行选择。
现有软件工程专业课程表(采用TXT文件格式),格式如下:
课程代号课程名称先修课程代号
11049高等代数C
25003计算机高级语言
22222计算机导论
33333计算机结构与组成25003,22222
……
使用“拓扑排序”算法,设计一个程序:
(1)验证软件工程专业课程表是否合理?
若不合理,指出并修改不合理的课程安排,产生新的软件工程专业课程表;
(2)对软件工程专业课程表,输出多种选课方案,以供学生进行选择。
利用图和栈存储结构;
并利用贪婪算法来求解问题;
有向图的顶点代表任务,有向边(i,j)表示先后关系,任务j开始前任务i必须完成。
利用数组v来描述课程,用一个栈来保存可加入V的候选点,并用一维数组InDegree,InDegree[j]表示与顶点i相连的节点数目,其中顶点i不是V中的成员,它们之间有向图得边为(i,j),当InDegree[j]变为0时,表示j成为一个候选点。
序列v初始时为空。
InDegree[j]为顶点j的入度。
每次向v中加入一个顶点时,所有与新加入顶点临接的顶点j,其InDegree[j]减1.
boolTopological(intv[])
S.Add(i)
Begin(w)
S.Delete(w)
NextVertex(w)
每一步,从栈中去出一个顶点将其加入v,同时减去与其邻接的顶点的InDegree值。
测试数据:
44444软件工程概论22222
55555面向对象程序设计25003
11016离散数学11049,25003
25057数据结构与算法11016,25003
66666操作系统33333,25057
70000计算机网络25057
70010统一建模语言44444,55555
70020软件需求44444
70030软件测试44444
70040软件过程与管理70020,70030
70050软件项目管理70040
70060软件能力成熟度模型70050
运行结果:
软公选课课程推荐表:
课程代号课程名称
33333计算机结构与组成
11016离散数学
55555面向对象程序设计
25057数据结构与算法
66666操作系统
44444软件工程概论
70010统一建模语言
70020软件需求
70030软件测试
70040软件过程与管理
70050软件项目管理
70060软件能力成熟度模型
70000计算机网络
第一和第三个for循环的时间开销为O(n),利用邻接矩阵,改程序的时间复杂度为O
(n2).
当算法失败时,有向图没有拓扑序列,若算法没有失败,则v为一个拓扑序列。
boolNetwork:
Topological(intv[])
{//Computetopologicalorderingofdigraphvertices.
//Returntrueifatopologicalorderisfound.
//Inthiscasereturntheorderinv[0:
n-1].
//Returnfalseifthereisnotopologicalorder.
intn=Vertices();
//Computein-degrees
int*InDegree=newint[n+1];
InitializePos();
//graphiteratorarray
for(inti=1;
i<
=n;
i++)//initialize
InDegree[i]=0;
i++){//edgesoutofi
intu=Begin(i);
while(u){
InDegree[u]++;
u=NextVertex(i);
//Stackverticeswithzeroin-degree
LinkedStack<
int>
S;
i++)
if(!
InDegree[i])S.Add(i);
//Generatetopologicalorder
inti=0;
//cursorforarrayv
while(!
S.IsEmpty()){//selectfromstack
intw;
//nextvertex
S.Delete(w);
v[i++]=w;
intu=Begin(w);
while(u){//updatein-degrees
InDegree[u]--;
InDegree[u])S.Add(u);
u=NextVertex(w);
DeactivatePos();
delete[]InDegree;
return(i==n);
////CourseSequence.cpp:
定义控制台应用程序的入口点。
////
//
course.h"
ldigraph.h"
intn=0;
//读取文件
int*T=newint[n+1];
/*for(inti=0;
T[i]=0;
*/
course*Mycou=newcourse[n+1];
/*course*T_Mycou=newcoures[n+1];
if(i==9||i==11||i==12||i==14||i==15)
Mycou[i].v>
Mycou[i].num>
Mycou[i].name>
Mycou[i].fnum1;
elseif(i==0||i==1||i==2)
Mycou[i].name;
else
Mycou[i].fnum1>
Mycou[i].fnum2;
//初始化图
LinkedDigraphDG(n);
if(Mycou[i].v==10||Mycou[i].v==12||Mycou[i].v==13||Mycou[i].v==15||Mycou[i].v==16)
DG.Add(Mycou[i].fnum1,Mycou[i].v);
elseif(Mycou[i].v==1||Mycou[i].v==2||Mycou[i].v==3)
continue;
DG.Add(Mycou[i].fnum2,Mycou[i].v);
/*cout<
Thegraphis"
<
endl;
DG.Output();
DG.Topological(T);
//拓扑排序
data1.txt"
f2<
课程代号"
课程名称"
//输出排序后课表
f2<
Mycou[T[i]-1].num<
Mycou[T[i]-1].name<
实习四
电话簿软件的实现(动态查找表算法的应用)
【问题描述】
在很多实际应用中,动态索引结构在文件创建或初始装入记录时生成,在系统运行过程中插入或删除记录时,为了保持较好的检索性能,索引结构本身将随之发生改变。
教材上已经介绍的动态查找数据结构包括:
二叉搜索树(BST)、平衡二叉树(AVL)、红黑树(RBT)、B-树。
本题要求选取一种已经学过的动态搜索树结构,设计并实现一个手机电话薄软件。
【基本要求】
一个完整的电话簿软件应具有以下功能:
(1)支持复式电话簿数据的存储,数据条目不少于500条。
每个人名下可保存的信息包括:
姓名、手机号码、住宅电话号码、办公电话号码、电子邮件地址、所属群组、备忘录等。
(2)支持电话簿记录的添加、删除、编辑等操作。
(3)将不同类型的人群按照同事、朋友、家人、商务伙伴等分组,支持群组记录的添加、删除、编辑等操作。
(4)支持所有电话簿记录的导入、导出操作,外部数据采用TXT格式。
(5)支持电话簿记录的各种查询操作,具体包括:
①逐条翻看
能显示所有的电话簿记录,支持分屏查看。
②电话号码查找
输入一个电话号码(手机、住宅、办公),能将包含该号码的电话簿记录显示出来。
③人名查找
输入一个人名(全名或者部分名),能将包含该姓名的电话簿记录显示出来。
④群组查找
选择一种群组类型,能将属于该群组的所有电话簿记录显示出来。
(6)要求使用BST或者AVL实现动态索引结构。
【提高要求】
(1)系统支持铃声库和图片库的数据存储,提供添加、删除、修改、播放等操作。
铃声库和图片库可直接使用文件目录进行管理;
铃声格式可使用WAV、MP3或者WMA格式;
图片格式可使用BMP、JPG等格式。
(2)电话簿记录信息支持:
来电铃声、来电图片等信息,用户可通过界面编辑或者浏览某条电话簿记录的来电铃声、来电图片。
(3)人名查询支持:
输入姓名的首字母查找。
(4)使用红黑树或者B-树的数据结构,来实现动态索引结构。
【测试数据】
自行随机生成500~1000条电话簿数据记录。
【实现提示】
(1)设计合适的电话簿数据文件格式;
(2)设计合适的索引文件格式。
利用二叉搜索数为存储结构进
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构与算法 数据结构 算法 课程设计