路由表生成程序Word格式文档下载.docx
- 文档编号:22726236
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:23
- 大小:204.03KB
路由表生成程序Word格式文档下载.docx
《路由表生成程序Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《路由表生成程序Word格式文档下载.docx(23页珍藏版)》请在冰豆网上搜索。
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])
{
distance[j]=distance[u]+G->
edge[u][j];
path[j]=u;
目的路由下一跳路由\n"
fp=fopen("
luyoubiao.txt"
"
w"
if(i==v0)continue;
j=i;
while(path[j]!
=v0)
j=path[j];
if(j==-1)break;
%5d%12d\n"
i+1,j+1);
fprintf(fp,"
fclose(fp);
SeqList.h
DataTypelist[MaxSize];
intsize;
}SeqList;
/////初始化顺序表
voidListInitiate(SeqList*L)/*初始化顺序表L*/
L->
size=0;
/*********************************************
*函数作用:
求当前元素个数
**********************************************/
intListLength(SeqListL)/*返回顺序表L的当前数据元素个数*/
returnL.size;
插入数据元素
intListInsert(SeqList*L,inti,DataTypex)
/*在顺序表L的第i(0<
=i=size)个位置前插入数据元素值x*/
/*插入成功返回1,插入失败返回0*/
intj;
//cout<
应有的数字"
if(L->
size>
=MaxSize)
顺序表已满无法插入!
return0;
elseif(i<
0||i>
size)
参数i不合法!
else
/*为插入做准备*/
for(j=L->
size;
j>
i;
j--)
L->
list[j]=L->
list[j-1];
L->
list[i]=x;
//cout<
x<
"
;
hao"
size++;
//元素个数加1
L->
size<
return1;
删除数据元素
intListDelete(SeqList*L,inti,DataType*x)
/*删除顺序表L中位置为i(0<
=i=size-1)的数据元素并存放到x中*/
/*删除成功返回1,删除失败返回0*/
size<
=0)
顺序表已空无数据元素可删!
size-1)
return0;
*x=L->
list[i];
/*保存删除的元素到x中*/
/*依次前移*/
for(j=i+1;
=L->
size-1;
L->
list[j-1]=L->
list[j];
size--;
//元素个数减1
取数据元素
intListGet(SeqListL,inti,DataType*x)
/*取顺序表L中第i个数据元素存于x中,成功返回1,失败返回0*/
if(i<
L.size-1)
*x=L.list[i];
路由表生成程序.c
#include<
stdlib.h>
malloc.h>
#include<
windows.h>
stdio.h>
string.h>
conio.h>
typedefintDataType;
#defineMaxSize10
#defineMaxVertices10
#defineMaxWeight10000
AdjMGraph.h"
AdjMGraphg1;
inta[MaxSize];
RowColWeightrcw[100];
//主函数
voidmenu()
intp;
voidputList();
voidDeletevertex();
voidDeleteedge();
voidInsertedge();
**********************网络路由生成************************\n"
**********************请选择相应实现功能******************\n"
**********************1.路由表输出并打印******************\n"
**********************2.删除节点**************************\n"
**********************3.删除边****************************\n"
**********************4.填加边****************************\n"
**********************5.退出系统**************************\n"
**********************请输入你的选择(1~5)***************\n"
scanf("
%d"
&
p);
if(p<
1||p>
5)
{printf("
\n\n输入序号不属于菜单,请重新输入\n\n"
p=6;
switch(p)
case1:
putList();
break;
//路由表输出并打印
case2:
Deletevertex();
//删除节点
case3:
Deleteedge();
//删除边
case4:
Insertedge();
case5:
exit(0);
//退出
case6:
menu();
voidputList()
intdistance[7],path[7];
请输入你要生成的路由表的起始路由器是第几个路由器v\n"
i);
i--;
Dijkstra(&
g1,i,distance,path);
从顶点%d到其他各顶点的最短距离为:
a[i]);
for(j=0;
g1.vertices.size;
到顶点%d的最短距离为%d\n"
a[j],distance[j]);
menu();
voidDeletevertex()
inti;
请输入你要删除的是第几个顶点v\n"
DeleteVertex(&
g1,i);
menu();
voidDeleteedge()
请输入你要删除的边的两个顶点v1,v2\n"
%d%d"
i,&
j);
DeleteEdge(&
g1,i-1,j-1);
voidInsertedge()
inti,j,w;
请输入你要删除的边的两个顶点和其权直v1,v2,w\n"
%d%d%d"
j,&
w);
InsertEdge(&
g1,i-1,j-1,w);
intmain()
//AdjMGraphg1;
inti,j,k;
FILE*fp;
//读入文件
//inta[MaxSize];
//RowColWeightrcw[100];
tuoputu10.txt"
r"
fscanf(fp,"
i;
a[k]);
j;
rcw[k].row,&
rcw[k].col,&
rcw[k].weight);
GraphInitiate(&
g1);
CreatGraph(&
g1,a,i,rcw,j);
3.3.3数据文本文件
程序的数据存储在文本文件中tuoputu10.txt中,从文件读入,文本文件如下:
7
1234567
26
012
036
051
102
122
134
212
231
253
262
306
314
321
341
366
431
453
461
501
523
543
561
622
636
641
651
运行程序,路由表以文件的形式输出,存储在文件luyoubiao.txt中
目的路由下一跳路由
12
22
44
54
66
77
3.4程序运行结果
3.4.1输出路由表
运行程序,随机输入要生成路由表的起点结点,输出该点的路由表
程序运行,输入生成路由表结点序号3,输出结点3到各路由器的下一跳路由以及到该路由的距离,并将路由表以文件的形式输出,保
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 路由 生成 程序