数据结构课程设计实验报告.docx
- 文档编号:24066317
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:16
- 大小:49.45KB
数据结构课程设计实验报告.docx
《数据结构课程设计实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
数据结构课程设计实验报告
江苏大学计算机学院
软件工程课程设计报告书
课程名称数据结构
课程设计总评成绩
学生姓名、学号卢江涛3100608047
学生专业班级软件工程软件1002班
指导教师姓名王新胜
一、问题描述
以邻接表的方式确定有向网,完成:
1.建立并显示它的邻接链表;
2.以非递归的方式进行深度优先遍历,显示遍历的结果;
3.对该图进行拓扑排序,显示拓扑排序的结果,并随时显示入度域的变化情况;
4.给出某一确定定点到所有其它顶点的最短路径。
二、程序的系统功能结构
有向网
深度优先遍历
最短路径
入度域变化
拓扑排序
输出邻接表
三、主要的算法思想
(1)、建立图类,建立相关成员函数,最后在主函数中实现,具体成员函数的实现请参看源程序。
(2)、主要的数据结构设计说明。
(3)、图邻接矩阵、邻接表的建立。
图的深度优先遍历、拓扑排序、顶点之间的最短路径。
(4)程序的主要模板template
(5)、程序的主要函数Graph、link()、DFTraverse()、TopologicalOrder()、TopologicalOrder()、GetVertexPos()、ShortestPath
四、补充说明
程序主要是通过建立一个图的模板类来调用相应的构造函数以及相应的成员函数来实现其功能,首先用结构体来存储边节点和顶点节点,用邻接矩阵来存储此有向图,遍历的过程采用双从循环来使得遍历达到最底端,最短路径采用了递归的思想循环调用最短路径函数来完成最短路径的查找,拓扑排序中首先优先输出入度为零的节点,然后通过删除该节点继续此过程进行排序。
五、源程序代码
#include
usingnamespacestd;
constintMaxVertexes=20;//最大的顶点数
constintb=10000;
template
structArcNode{//定义边结点
friendclassGraph
intadjvex;//和边(或弧)相关联的另一个顶点序号
intweight;//边(或弧)上的信息
ArcNode*nextarc;//指向下一条边结点的指针
ArcNode(intv,intw):
adjvex(v),weight(w),nextarc(NULL){}
};//构造函数
template
structVertexNode
{//定义顶点结点
friendclassGraph
Typedata;//顶点的信息
ArcNode*firstarc;//指向依附该顶点的边链表
};
template
{
VertexNode
intCurrentNumVertexes;//当前的顶点数
intCurrentNumArcs;//当前的边(或弧)数
public:
intGetVertexPos(constType&v);//取顶点v在数组中的位置
Graph(Typev[],intnum=MaxVertexes);//构造函数
TypeGetValue(intv);//取图中顶点v的值,如果顶点v不存在则返回空
intGetweight(intv1,intv2);//取边(或弧)上的权值
intGetFirstNeighbor(intv);//取图中顶点v的第一个邻接点的序号。
如果不存在返回-1
intGetNextNeighbor(intv1,intv2);//取图中下一个邻接点
intArcs[MaxVertexes][MaxVertexes];//用数组记录每个边的信息
intInVertex(Type&v);//在图中插入结点
intInsertArc(intv1,intv2,intw);//在图中插入依附于v1和v2的边或弧,w是信息
intNumberOfVertexes(){returnCurrentNumVertexes;}//返回当前的顶点数
intNumberOfArcs(){returnCurrentNumArcs;}//返回当前的边(或弧)数
int*dist;//最短路径长度数组
int*InDegree;//入度数组,记录每个顶点的入度
int*path;//最短路径的数组
int*s;//最短路径终点数组
voidlink();//输出邻接链表
voidDFS(constintv,intvisited[]);//深度优先搜索
voidDFTraverse();//深度遍历
voidTopologicalOrder();//拓扑排序
voidShortestPath(intn,intv);//最短路径
};
template
:
GetVertexPos(constType&v){//根据顶点v查找该顶点在邻接表中的位置
for(inti=0;i if(VTable[i].data==v)returni; return-1; } template : Graph(Typev[],intnum=MaxVertexes): CurrentNumVertexes(0),CurrentNumArcs(0) { Typetail,head; inti=0,e,h,t,w,p=0; while(p for(intj=0;j Arcs[p][j]=b; if(p==j){Arcs[p][j]=0;} } p++; } InDegree=newint[MaxVertexes]; VTable=newVertexNode for(i=0;i {InVertex(v[i]);//在顶点表中插入顶点v[i] InDegree[i]=0; } cout<<"输入边的条数: ";cin>>e;//输入边的条数 cout< for(i=0;i cout<<"输入第"< (弧头,弧尾,权值)"< cin>>tail>>head>>w;//输入一条边 intj=GetVertexPos(head); while((t=GetVertexPos(tail))==-1) cout<<"输入的顶点(tail)不存在"; while((h=GetVertexPos(head))==-1) cout<<"输入的顶点(head)不存在"; InsertArc(t,h,w);//插入一条边 InDegree[j]++;//顶点j的入度加1 cout< } } template : GetValue(intv){//取图中顶点v的值,如果顶点v不存在,则返回空 if(v>=0&&v returnNULL; } template : Getweight(intv1,intv2){//取出以顶点v1和v2为两端点的边上的权值 if(v1>=0&&v1 ArcNode*p=VTable[v1].firstarc; while(p! =NULL){ if(p->adjvex==v2){returnp->weight;} else{p=p->nextarc;} } }returnNULL; } template : GetFirstNeighbor(intv){//查找顶点v的第一个邻接顶点的位置 if(v>=0&&v ArcNode*p=VTable[v].firstarc; if(p! =NULL)returnp->adjvex; } return-1; } template : GetNextNeighbor(intv1,intv2){//查找顶点v1的在v2之后的下一个邻接顶点,如果不存在返回-1 if(v1! =-1){ ArcNode*p=VTable[v1].firstarc; while(p! =NULL){ if(p->adjvex==v2&&p->nextarc! =NULL) returnp->nextarc->adjvex;//返回下一个邻接顶点在邻接表中的位置 elsep=p->nextarc; } } return-1;//没有查到下一个邻接顶点返回-1 } template : InsertArc(intv1,intv2,intw) {//在图中插入弧 if(v1>=0&&v1 Arcs[v1][v2]=w; ArcNode*newnode=newArcNode(v2,w); ArcNode*h=VTable[v1].firstarc; if(h! =NULL){ ArcNode*p=h; while(h! =NULL&&h->adjvex p=h;h=h->nextarc; } newnode->nextarc=p->nextarc; p->nextarc=newnode; return1; } VTable[v1].firstarc=newnode; return1; } return-1; } template : InVertex(Type&v) {//在图中插入顶点,插入成功则返回1,否则返回0 if(CurrentNumVertexes VTable[CurrentNumVertexes].data=v; VTable[CurrentNumVertexes].firstarc=NULL; CurrentNumVertexes++;return1; } return-1; } //以下是实验要求的函数 //输出邻接表 template : link()//输出邻接表 { cout<<"邻接表的结果为: "< for(inti=0;i cout< inta=GetFirstNeighbor(i); if(a! =-1)cout<<"->"< for(intj=a;j! =-1;j=a){ a=GetFirstNeighbor(j); if(a! =-1)cout<<"->"< } cout< } } //拓扑排序 template : TopologicalOrder() { intm=0;//m为输出的顶点数,初始值为0 for(inti=0;i { for(intn=0;n { if(InDegree[n]==0) { m++;//输出的顶点数加1 cout< InDegree[n]=-1; for(intt=0;t { if(n>=0&&n { if(t>=0&&t { if(Arcs[n][t]! =0&&Arcs[n][t]! =b) InDegree[t]--; } } } } } } if(m "< } //深度遍历 template voidGraph : DFS(constintv,intvisited[]) { cout< visited[v]=1;//顶点v作访问标记 intw=GetFirstNeighbor(v); while(w! =-1){//若顶点w存在 if(! visited[w])DFS(w,visited); w=GetNextNeighbor(v,w); }//重复检测v的所有邻接顶点 } template voidGraph : DFTraverse() { inti,n=NumberOfVertexes();//取图的顶点个数 int*visited=newint[n];//定义访问标记数组visited for(i=0;i visited[i]=0;//访问标记数组visited初始化 for(i=0;i if(! visited[i])DFS(i,visited); delete[]visited;//释放visited } template : ShortestPath(intn,intv)//求最短路径 { intmin,u; dist=newint[n];s=newint[n];path=newint[n]; for(intj=0;j dist[j]=Arcs[v][j];s[j]=0; if(j! =v&&dist[j] elsepath[j]=-1;s[v]=1; } for(inti=0;i<=n-1;i++){ min=MaxVertexes;u=v; for(intj=0;j if(! s[j]&&dist[j] u=j;min=dist[j]; } s[u]=1; for(intw=0;w if(! s[w]&&dist[u]+Arcs[u][w] { dist[w]=dist[u]+Arcs[u][w]; path[w]=u; } if(v! =i&&dist[i]! =10000&&v! =path[i]) cout< "< elseif(v! =i&&dist[i]! =10000) cout< "< } for(intm=0;m cout< "< } //主函数 voidmain() { intm,w; chara[20],c; cout<<"请你输入顶点的数目: "; cin>>m; for(inti=0;i { cout<<"请输入第"< "; cout< cin>>a[i]; cout< } Graph G.link(); cout<<"深度遍历的结果为: "< G.DFTraverse(); cout< cout<<"拓扑排序的结果为: "< G.TopologicalOrder(); cout< cout<<"输入源点: "< cin>>c; w=G.GetVertexPos(c); G.ShortestPath(m,w); } 六、课程设计遇到的问题及解决方法 1.语法错误太多,由于大部分函数都是按照书上的思想进行设计的,思想是没问题的,可是书上存在印刷错误,语法错误比较容易,只需要根据说明逐个修改即可,此外还有大括号匹配错误。 2.出现了死循环,在输出邻接表的过程中出现了死循环,主要是循环过程中的条件出现了问题,修改好之后虽然又出现了死循环,但是主要是由于自己的输入不正确造成的。 3.对主函数进行了彻底的修改,尽量使得输出格式漂亮,条理清晰,同时对最短路径和邻接表的输出函数进行了修改,尽量使得函数简单易懂,同时又可实现其功能。 4.此外在设计循环的过程中遇到许多麻烦,这要感谢老师以及同学。 七、输出结果显示 七、个人心得体会 通过这次的课程设计,对数据结构这门儿科目有了更深层次的认识,首先平时的学习毕竟只是理论上的学习,如果不拿来实践那就相当于白学,通过这次课程设计发现了好多小错误,这在平时作业中是无法发现的,真正的错误只有把它放到编译系统中才能明确的显示出来。 其次,这次课程设计更加让我发现了自己编程能力的差劲,好像根本就离不开书本,离开书本以后仿佛大脑就不知道该做什么,让我清晰的认识到自己还处于一个井底之蛙的状态,对编程实在实践的太少了,虽然思想重要,但是最终编程总是要运用到实践中去的,接下来得好好的进行练习。 最后,无意中听了老师的一句话,说这个过程只需要半年就可完成,自己接下来会把大部分精力都放在编程实践上,从小程序编起,一步一步的慢慢练好,脱离书本,最后编出真正属于自己的程序。 总之,我相信,功夫不负有心人,只要坚持下去,肯定会有好结果的,我会努力并期待那一天的到来! ! !
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 实验 报告