数据结构课程设计任务书.docx
- 文档编号:27563277
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:14
- 大小:138.29KB
数据结构课程设计任务书.docx
《数据结构课程设计任务书.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计任务书.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构课程设计任务书
数据结构课程设计报告
题目一:
图遍历的演示
题目二:
平衡二叉树的操作演示
班级:
计算092
姓名:
魏连龙
学号:
200907086
指导教师:
张艳
完成日期:
2011年6月29日
题目一:
图遍历的演示
一、需求分析
1.以邻接多重表为存储结构;
2.实现连通和非连通的无向图的深度优先和广度优先遍历;
3.以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和生成树的边集。
4.以教科书图7.33为测试数据。
暂时忽略里程,起点为北京。
二、概要设计
1.定义程序中用到的抽象数据类型
1)设定图的抽象数据类型:
ADTGraph{
数据对象V:
V是具有相同特性的数据元素的集合,称为点集.
数据关系R:
R={VR}
VR={(v,w)|v,w属于V,(v,w)表示v和w之间存在的路径}
基本操作P:
CreatGraph(&G,V,VR)
初始条件:
V是图的顶点集,VR是图中弧的集合.
操作结果:
按V和VR是定义构造图G.
LocateVex(G,u)
初始条件:
图G存在,u和G中顶点有相同的特征
操作结果:
若图G中存在顶点u,则返回该顶点在图中的位置;否则返回其他信息
FirstAjvex(G,v)
初始条件:
图G存在,v是G中顶点
操作结果:
返回v的第一个邻接顶点,若顶在图中没有邻接顶点,则返回为空
NextAjvex(G,v,w)
初始条件:
图G存在,v是G中顶点,w是v的邻接顶点
操作结果:
返回v的下一个邻接顶点,若w是v的最后一个邻接顶点,则返回空
DFSTraverse(G,visit())
初始条件:
图G存在,visit的顶点的应用函数
操作结果:
对图进行深度优先遍历,在遍历过程中对每个结点调用visit函数一次,一旦visit失败,则操作失败
BFSTraverse(G,visit())
初始条件:
图G存在,visit的顶点的应用函数
操作结果:
对图进行广度优先遍历,在遍历过程中对每个结点调用visit函数一次,一旦visit失败,则操作失败
}ADTGraph
2)设定队列的抽象数据类型:
ADTQueue{
数据对象:
D={ai|ai属于Elemset,i=1,2….,n,n>=0}
数据关系:
R1={
约定ai为端为队列头,an为队列尾
基本操作:
InitQueue(&Q)
操作结果:
构造一个空队列Q
DestryoQueue(&Q)
初始条件:
队列Q已存在。
操作结果:
队列Q被销毁,不再存在。
EnQueue(&Q,e)
初始条件:
队列Q已经存在
操作结果:
插入元素e为Q的新的队尾元素
DeQueue(&Q,&E)
初始条件:
Q为非空队列
操作结果:
删除Q的队尾元素,并用e返回其值
QueueEmpty(Q)
初始条件:
队列已经存在
操作结果:
若队列为空,则返回TRUE,否则返回FLASE
}ADTQueue
3)生成树的操作:
voidDFSTree(AMLGraphG,intv,CSTree&DT);
//从第v个顶点出发深度遍历图G,建立以DT为根的生成树。
voidPrintTraverse(CSTreeT);
//打印图G的遍历生成树的边。
voidPrintAllTraverse(CSTreeT)
//打印图G的遍历生成森林的边。
voidBFSTree(AMLGraphG,intv,CSTree&BT);
//从第v个顶点出发广度遍历图G,建立以BT为根的生成树。
2.程序中包含的模块及模块间的关系说明。
本程序有三个模块:
1)主程序模块
显示主菜单界面,在此界面中按照提示进行操作。
1.创建无向图
2.从文件读取图
3.打印关系图
4.深度优先搜索
5.广度优先搜索
6.深度优先遍历及生成树的边集
7.广度优先遍历及生成树的边集
8.程序结束
2)图的各抽象数据类型模块
3)图的各种操作模块
各模块之间的调用关系:
主程序模块
图的各种操作模块
图的各抽象数据类型模块
三、详细设计
1.定义程序中所有用到的数据及其数据结构,及其基本操作的实现;
//无向图的邻接多重表存储表示
#defineMAX_VERTEX_NUM30//最大顶点30
typedefenum{unvisited,visited}VisitIf;
typedefstructEBox//边集
{
VisitIfmark;//访问标记
intivex,jvex;//该边依附的两个顶点的位置
structEBox*ilink,*jlink;//分别指向依附这两个顶点的下一条边
InfoType*info;//该边信息指针,可指向权值或其他信息
}EBox;
typedefstruct//顶点集
{
VertexTypedata;
EBox*firstedge;//指向第一条依附该顶点的边
}VexBox;
typedefstruct//图
{
VexBoxadjmulist[MAX_VERTEX_NUM];
intvexnum,edgenum;//无向图的当前顶点数和边数
}AMLGraph;
structedge//用于存储图的所有边,即用两个顶点来表示一条边
{
charva[MAX_NAME];
charvb[MAX_NAME];
}edge[MAX_VERTEX_NUM];
structDFS_Vex//用于存储DFS的顶点序列
{
charv[MAX_NAME];
}DFS_Vex[MAX_VERTEX_NUM];
structBFS_Vex//用于存储BFS的顶点序列
{
charv[MAX_NAME];
}BFS_Vex[MAX_VERTEX_NUM];
//利用链表的存储结构表示队列
typedefstructQNode
{
QElemTypedata;//数据域
structQNode*next;//指针域
}QNode,*QueuePtr;
typedefstruct
{
QueuePtrfront,rear;//队头、队尾指针
}LinkQueue;
StatusQueueEmpty(LinkQueueQ)
{//若Q为空队列,则返回TRUE,否则返回FALSE
if(Q.front->next==NULL)
returnTRUE;
else
returnFALSE;
}
voidEnQueue(LinkQueue&Q,QElemTypee)
{//插入元素e为Q的新的队尾元素
QueuePtrp=(QueuePtr)malloc(sizeof(QNode));
if(!
p)//存储分配失败
exit(ERROR);
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
}
StatusDeQueue(LinkQueue&Q,QElemType&e)
{//若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR
QueuePtrp;
if(Q.front==Q.rear)
returnERROR;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p)
Q.rear=Q.front;
free(p);
returnOK;
}
voidInitQueue(LinkQueue&Q)
{//构造一个空队列Q
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!
Q.front)
exit(-1);
Q.front->next=NULL;
}
intLocateVex(AMLGraphG,VertexTypev)
{//初始条件:
无向图G存在,u和G中顶点有相同特征
//操作结果:
若G中存在顶点u,则返回该顶点在无向图中位置;否则返回-1
inti;
for(i=0;i if(! strcmp(v,G.adjmulist[i].data)) returni; return-1; } 2.主函数和其他函数的伪码算法; 1)主函数 voidmain() { 显示菜单; 输入功能选择键; switch(message) { case1: 创建无向图; case2: 从文件读取图; case3: 打印关系图; case4: 进行深度优先遍历图; case5: 进行广度优先遍历图; case6: 深度优先遍历及生成树的边集; case7: 广度优先遍历及生成树的边集; case8: 程序结束; } } 3.画出函数之间的调用关系图。 main CreateGraphfopenDisplayDFSTraverseBFSTraverse StrcpyLocateVexMarkUnvizited LocateVexStrcpy DFS_SearchDFSInitQueueBFS_SearchDeQueue LocateVex FirstAdjVexNextAdjVex StrcmpFirstAdjVexNextAdjVexStrcmp LocateVexLocateVex 四、调试分析 1.本程序以邻接多重表为存储结构。 这个程序涉及到图的生成和图的深度以及广度遍历,队列的操作,另外还有打印生成树边集。 2.本程序可以进行连通无向图的遍历,创建无向图等。 其中深度优先遍历采用递归的方式来实现,而广度优先遍历则是采用非递的形式实现的。 3.本程序的测试数据是来自课本上的例图,为了能利用该数据进就行测试,新加了了一个文件读取的内用,不过这个功能仅仅是对于该测试数据来使用的,只能读取一个文件。 五、用户手册 1.程序的运行为Windows下的命令提示符,程序文件句为: 图的遍历.exe 2.2.双击打开程序后出现如下界面: 3.选择操作1: 程序就提示分别输入无向图的顶点数,边数,边的信息,顶点的值,输入完成后,程序提示按任一键返回菜单。 4.选择操作2: 界面显示文件读取成功,并提示按任一键返回。 5.选择操作3: 程序显示图的顶点和边的信息。 6.选择操作4: 系统提示输入遍历图的起始点,程序运行后,首先显示深度优先遍历的访问结点序列。 7.选择操作5: 系统提示输入遍历图的起始点,程序运行后,首先显示广度优先遍历的访问结点序列。 8.选择操作6: 系统提示输入遍历图的起始点,程序运行后,首先显示深度优先遍历的访问结点序列和生成树的边集。 9.选择操作7: 系统提示输入遍历图的起始点,程序运行后,首先显示广度优先遍历的访问结点序列和生成树的边集。 10.选择操作8: 退出程序。 六、测试结果 1.选择操作二,直接在文件中读取数据。 2.选择操作三,打印关系图: 3.深度优先遍历及其生成树边集: 4.广度优先遍历及其生成树边集: 七、附录 head.h//图和生成树边集的存储结构等函数 Main.cpp//深度、广度优先遍历及其生成树边集的操作函数,以及主函数。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 任务书