路由表生成程序Word格式文档下载.docx
- 文档编号:13400798
- 上传时间:2022-10-10
- 格式:DOCX
- 页数:20
- 大小:203.61KB
路由表生成程序Word格式文档下载.docx
《路由表生成程序Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《路由表生成程序Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。
3.3源代码
AdjMGraph.h
#include"
SeqList.h"
//邻接矩阵实现图的存储类型定义
typedefstruct
{
SeqListvertices;
//存放顶点的顺序表
intedge[MaxVertices][MaxVertices];
//存放边的邻接矩阵
intnumOfEdges;
//边的数目
}AdjMGraph;
//图的结构体定义
introw;
//行下标
intcol;
//列下标
intweight;
//权值
}RowColWeight;
//边信息结构体定义
//置带权有向图G为空图
voidGraphInitiate(AdjMGraph*G)
inti,j;
for(i=0;
i<
MaxVertices;
i++)
for(j=0;
j<
j++)
{
if(i==j){
G->
edge[i][j]=0;
}
else{
edge[i][j]=MaxWeight;
}//MaxWeight表示权值无穷大
}
G->
numOfEdges=0;
//边的条数置为0
ListInitiate(&
G->
vertices);
//顶点顺序表初始化
}
//在带权有向图G中插入顶点vertex。
如果图中已经有顶点vertex,则图不变,时间复杂度:
O(n)。
voidInsertVertex(AdjMGraph*G,DataTypevertex)
//if(IsVertex(G,vertex)<
0)
if(ListInsert(&
vertices,G->
vertices.size,vertex)==0)//在顶点顺序表的表尾插入顶点vertex
printf("
插入顶点时空间已满无法插入!
"
);
exit
(1);
/*在带权有向图G中插入一条第v1个顶点指向第v2个顶点,权值为weight的有向边。
*如果v1和v2有一个不是图中的顶点,则图不变;
如果v1和v2相等,则图不变。
*如果图已经包含该边,则边的权值更改为新的权值,时间复杂度:
O
(1)。
上面插入的是有向边,我们插入无向边的时候可以进行两次的有向边的插入。
*/
voidInsertEdge(AdjMGraph*G,intv1,intv2,intweight)
DataTypex;
if(v1!
=v2)
{
if((ListGet(G->
vertices,v1,&
x)==0)||(ListGet(G->
vertices,v2,&
x)==0))
插入边时参数v1和v2越界出错!
\n"
edge[v1][v2]=weight;
edge[v2][v1]=weight;
numOfEdges++;
}
//在带权有向图G中删除一条第v1个顶点指向第v2个顶点的边。
voidDeleteEdge(AdjMGraph*G,intv1,intv2)
edge[v1][v2]=MaxWeight;
edge[v2][v1]=MaxWeight;
numOfEdges--;
//删除顶点
//在带权有向图G中删除第v个顶点,时间复杂度:
O(n^2)。
voidDeleteVertex(AdjMGraph*G,intv)
intm3,i,j;
m3=v-1;
if(m3<
0||m3>
=G->
vertices.size)
对不起,此链路内没有您想要删除的路由节点\n"
exit(0);
else
{
//for(i=m3;
vertices.size;
for(j=0,i=m3;
{
G->
edge[j][i]=MaxWeight;
}
//for(i=m3;
for(i=m3,j=0;
G->
//G->
vertices.list[i]=G->
vertices.list[i]-1;
//G->
vertices.size--;
//printf("
删除结点成功\n"
//有没有向是一样的。
//在带权有向图G中取第v个顶点的第一个邻接顶点,如果这样的邻接顶点存在,则返回该顶点在顶点顺序表的序号,否则返回-1.时间复杂度:
intGetFirstVex(AdjMGraphG,intv)
DataTypex;
v=v-1;
if(ListGet(G.vertices,v,&
x)==0)
printf("
取第一个邻接顶点时参数v越界出错!
exit
(1);
//寻找邻接矩阵v行中从最左开始第一个值非零且非无穷大的权值对应的顶点
for(col=0;
col<
G.vertices.size;
col++)
if(G.edge[v][col]>
0&
&
G.edge[v][col]<
MaxWeight)
returncol;
return-1;
//在带权有向图G中取第v1个顶点的继邻接结点第v2个顶点之后的下一个邻接结点,时间复杂度:
intGetNextVex(AdjMGraphG,intv1,intv2)
if((ListGet(G.vertices,v1,&
x)==0)||(ListGet(G.vertices,v2,&
取下一邻接顶点时参数v1和v2越界出错!
if(G.edge[v1][v2]==0)
printf("
v2不是v1的邻接顶点\n"
//寻找邻接矩阵v行中从第v2+1列开始的第一个值非零且非无穷大的权值对应的顶点
for(col=v2+1;
if(G.edge[v1][col]>
G.edge[v1][col]<
MaxWeight)
return-1;
//创建有向图G,通过在空图G中插入n个顶点和e条边实现。
时间复杂度:
O(n^2+e)。
voidCreatGraph(AdjMGraph*G,DataTypev[],intn,RowColWeightW[],inte)
inti,k;
GraphInitiate(G);
n;
//cout<
<
n<
endl;
InsertVertex(G,v[i]);
for(k=0;
k<
e;
k++)
InsertEdge(G,W[k].row,W[k].col,W[k].weight);
//迪克特斯拉算法求得是最短路径和相应的路由器
voidDijkstra(AdjMGraph*G,intv0,intdistance[],intpath[])
/*带权图G从下标0顶点到其它顶点的最短距离distance*/
/*和最短路径上顶点前驱下标path*/
{
intn=G->
int*S=(int*)malloc(sizeof(int)*n);
//S数组
intminDis,i,j,u;
FILE*fp;
/*初始化*/
for(i=0;
i<
n;
i++)
{
distance[i]=G->
edge[v0][i];
S[i]=0;
if(i!
=v0&
distance[i]<
MaxWeight)
path[i]=v0;
elsepath[i]=-1;
S[v0]=1;
/*在当前还未找到最短路径的顶点集中选取具有最短距离的顶点u*/
for(i=1;
minDis=MaxWeight;
for(j=0;
j<
j++)
if(S[j]==0&
distance[j]<
minDis)
{
u=j;
minDis=distance[j];
/*当已不再存在路径时算法结束*/
if(minDis==MaxWeight)return;
S[u]=1;
/*标记顶点u已从集合T加入到集合S中*/
/*修改从v0到其它顶点的最短距离和最短路径*/
for(j=0;
j<
j++)
if(S[j]==0&
edge[u][j]<
MaxWeight&
distance[u]+G->
distance[j])
{
d
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 路由 生成 程序