算法与数据结构课程设计 报告Word格式.docx
《算法与数据结构课程设计 报告Word格式.docx》由会员分享,可在线阅读,更多相关《算法与数据结构课程设计 报告Word格式.docx(228页珍藏版)》请在冰豆网上搜索。
4.有向网的基本操作及应用
①
创建有向网的邻接矩阵
②
创建有向网的邻接表
③
关键路径
④
单源最短路径
三.设计指导
第一步:
根据设计任务,设计
DOS菜单。
第二步:
设计菜单(c语言)
#include<
stdio.h>
voidShowMainMenu(){
printf("
\n"
);
**************
***************\n"
*1无向图的基本操作及应用*\n"
*2有向图的基本操作及应用
*\n"
*3
无向网的基本操作及应用
*\n"
*4
有向网的基本操作及应用
*5
退出
***********************************************\n"
}
voidUDG(){
intn;
do{
无向图的基本操作及应用
*1
创建无向图的邻接矩阵
*2
创建无向图的邻接表
无向图的深度优先遍历
无向图的广度优先遍历
***********************************\n"
请选择:
"
scanf("
%d"
&
n);
switch(n){
case1:
----------wait-------"
break;
case2:
case3:
case4:
case5:
default:
ERROR!
}while(n!
=5);
voidDG(){
有向图的基本操作及应用
创建有向图的邻接矩阵
创建有向图的邻接表
拓扑排序
*******************************\n"
--------wait-------"
=4);
voidUDN(){
无向网的基本操作及
***\n"
创建无向网的邻接矩阵
创建无向网的邻接表
Prim
算法求最小生成树
kraskal
*************************************\n"
---------wait-------"
---
----wait-------"
voidDN(){
有向网的基本操作
****\n"
创建有向网的邻接表
关键路径
单源顶点最短路径问题
voidmain(){
ShowMainMenu();
UDG();
DG();
UDN();
DN();
第三步:
添加功能函数。
在主程序的合适位置添加相应的函数实现各功能
(提示:
语句
printf(
“
-------wait---------
”
)
所在位置)
。
四.成绩评定
实习报告(文字不得少于
4000
字)
一、
设计方案;
二、
实现过程;
三、
实现代码;
四、
测试;
五、
结论;
六、
难点与收获。
设计方案:
由课程设计任务书,按照要求,需要设计有向图
3
、有向网、无向图
、无
向网四种图,邻接矩阵、邻接表两种数据存储结构,共十六种基本操作及应用,
三层以上的显示菜单。
图的操作中又包含有有关线性表、栈和队列的基本操作。
由于显示菜单已给出,
剩下的只是把函数写入其中,
而线性表、
栈和队列的基本
操作并不复杂,很容易实现,我们只有完成图的相关操作即可。
图的操作都是以两种存储结构为基础的,邻接矩阵存储结构和邻接表存储
结构,如四种图(有向图,有向网,无向图,无向网)的创建,其他的操作都是
在四种图创建后才开始进行的。
所以,首先必须理解两种存储结构的定义。
图的邻接矩阵存储结构即图的数组表示法。
用两个数组分别存储数据元素
(顶点)
的信息和数据元素之间的关系
(边或弧)
的信息。
用邻接矩阵存储结构的图具有
以下几点特征:
(一)
:
顶点数:
vexnum
,边(弧)数:
arcnum
,图的种类:
kind
;
(二)
邻接矩阵:
arcs(1
顶点关系类型
:
adj
2
相关信息
*info)
(三)
顶点向量(顶点名)
vexs[]
其优点是以二维数组表示有
n
个顶点的图时,
需存放
顶点的信息和
n*n
个弧的
信息存储量。
借助于邻接矩阵容易判定任意两个顶点之间是否有边或弧相连,
并
容易求各个顶点的度。
缺点其时间复杂度是
O
(
例如,构造一个具有
个
顶点和
e
条边的无向网的时间复杂度为
n*n+e*n
图的邻接表存储结构是图的一种链式存储结构。
对图中的每个顶点建立一个单链
表,每个结点有三个域组成,邻接点域
adjvex
(弧尾在邻接表链表中的位序)
,
链域
nextarc
(下一条弧)
,数据域
info(
权值
还要建立一个邻接表链表,用以
存放顶点名
data
和后继指针
firstarc,
表头结点以顺序结构的形式存储,便于随机
访问任一顶点的单链表。
邻接表存储结构的优点在于其时间复杂度小。
除此之外,还有十字链表存储结构和多重链表存储结构。
由于,没有用到他们,
故不再详细描述。
树的深度优先搜索遍历类似于树的先根遍历,
是树的先根遍历的推广。
从图中的
某个顶点出发,
访问此顶点,
然后依次从该顶点出发深度优先搜索遍历图,
直至
图中所有与该顶点有关的路径都被访问到;
此时图中若还有顶点未被访问到,
则
另选图中的一个未被访问的顶点作为起始点,
重述上述过程,
直至所有顶点都被
访问到。
广度优先搜索遍历类似于树的按层次遍历的过程。
以某个顶点为起始顶点,
由近
至远,
依次访问和该顶点有路径相通的且路径长度为
1
·
的顶点。
当图中所有顶点都被访问到后,就完成了图的广度优先搜索遍历。
求无向网的最小生成树问题有两种算法:
Prima
算法和
Kruskal
算法。
算法
是从网中的某个顶点出发,
选择与该顶点有路径的所有顶点中路径最小的一条路
径,
从该最小路径的另一顶点出发,
重复上述过程,
直至图中所有顶点都被访问
完成。
算法是从网中找出所有路径最小的一条路径,记下已访问该路径
的两个顶点,
再次从图中找出剩下路径中的最小路径,
直至所有
顶点都被访问完成,按访问的顺序依次输出各顶点,即构造了一棵最小生成树。
由某个集合上的一个偏序得到该集合的一个全序的操作就叫做拓扑排序。
拓扑排
序主要有两个方面的操作:
)在有向图中选择一个没有前驱的顶点并输出;
)在图中删除该顶点和所有以它为尾的弧。
重复上述两步,直至全部顶点均
已输出,就得到了一个拓扑有序序列。
求关键路径的算法如下:
输入
条弧,建立
AOE
网的存储结构;
从源点
v0
出发
令
ve[0]=0
,按拓扑有序求其余各顶点的最早发生时间。
如果得
到的拓扑有序序列中的顶点个数小于网中的顶点数,
则说明网中存在环,
不能求
关键路径,算法终止;
否则执行第三步。
从汇点
vn
出发,
vl[n-1]=ve[n-1]
按逆拓扑有序求其余各顶点的最迟发生时间
vl[i]
根据各顶点的和值,求每条弧的最早开始时间
e(s)
和最迟开始时间
,若某条
弧满足条件
e(s)=l(s)
,则为关键活动。
从某个源点到其余各顶点的最短路径问题:
若从
v
到
vi
有弧,则
D[i]
为弧上的
权值,否则
为无穷大。
显然,长度为
D[j]=Min{D[i]|vi
属于
V}
的路径就是从
出发的长度最短的一条路径。
实现及测试过程
按照设计任务的要求,我先完成了存储结点、边、邻接矩阵、邻接表、队列、栈等储存
结构体的设计。
其次是栈和队列的基本操作和实现,
四种图的创建和显示,
然后是基于
两种存储结构的各种算法的现,最后是三层显示输出菜单。
测试样图:
实现代码:
#include<
stdlib.h>
limits.h>
#defineERROR0
#defineOK1
#defineINFINITY
INT_MAX
#defineMAX_VERTEX_NUM21
#defineSTACK_INIT_SIZE
100
#defineSTACKINCREAMENT
10
typedefenum{DG,DN,UDG
UDN}GraphKind;
typedefstructArcCell{
int
adj;
//infotype
*info;
}ArcCell,
AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedefstruct{
char
vexs[MAX_VERTEX_NUM];
AdjMatrix
arcs;
vexnum,arcnum;
GraphKindkind;
}MGraph;
//
邻接矩阵
typedefstruct
ArcNode{
adjvex;
quan;
structArcNode
*nextarc;
}ArcNode,*AList;
typedefstructVNode{
data;
AList
firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];
typedef
struct{
AdjList
vertices;
GraphKind
kind;
}ALGraph;
邻接表
typedefstructQNode{
structQNode
*next;
}QNode,*QueuePre;
QueuePre
front;
rear;
}LinkQueue;
队列
typedefstruct{
*base;
int
*top;
stacksize;
}SqStack;
栈
lowcost;
}closedges[MAX_VERTEX_NUM];
求最小生成树中
的辅助数组
intoption;
intvisited[MAX_VERTEX_NUM];
顶点访问标记数组
intindegree[MAX_VERTEX_NUM];
顶点入度记录数组
intve[MAX_VERTEX_NUM];
顶点权值记录数组
SetGraphKind(MGraph&
G
intoption){
switch(option){
G.kind=DG;
G.kind=DN;
G.kind=UDG;
G.kind=UDN;
returnERROR;
returnOK;
邻接矩阵类型设置
SetGraphKind(A