路由表生成程序.docx

上传人:b****1 文档编号:473008 上传时间:2022-10-10 格式:DOCX 页数:20 大小:203.61KB
下载 相关 举报
路由表生成程序.docx_第1页
第1页 / 共20页
路由表生成程序.docx_第2页
第2页 / 共20页
路由表生成程序.docx_第3页
第3页 / 共20页
路由表生成程序.docx_第4页
第4页 / 共20页
路由表生成程序.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

路由表生成程序.docx

《路由表生成程序.docx》由会员分享,可在线阅读,更多相关《路由表生成程序.docx(20页珍藏版)》请在冰豆网上搜索。

路由表生成程序.docx

路由表生成程序

路由表

3.1任务要求

3.1.1需求分析

给定图的拓扑,每个组有小差别,然后从拓扑输入、任意去掉边、定点, 指定路由器号,生成其路由表并输出。

3.1.2要求

使用文件保存网络的拓扑结构,数据格式自己定义;

使用C语言编写路由表生成程序,程序运行后,根据用户选择去掉的边、定点等,重新生成路由表,输出到屏幕并保存到文件;

整个程序由小组分工完成,利用VSourceSafe同步保存各自代码至同一服务器上。

3.1.3拓扑图

3.2设计思路

3.2.1路由算法设计

主要根据狄克斯拉算法(Dijkastra)来求。

此算法的思想是:

设置两个顶点的集合S和T,集合S中存放已经找到最短路径的顶点,集合T中存放当前还未找到最短路径的顶点。

初始状态时,集合S中只包含源点,设为V0,然后从集合T中选择到源点V0路径长度最短的顶点u加入到集合S中,集合S中每加入一个新的顶点u,都要修改源点V0到集合T中剩余顶点的当前路径最短路径长度值,集合T中各顶点的新的当前最短路径长度值为原来的当前最短路径长度值与从源点过顶点u到达该顶点的路径长度值中的较小者。

此过程不断重复,直到集合中的顶点全部加入到集合S中去为止。

3.2.2详细设计

利用数据结构图的运用和链表,以及c语言文件的读取。

设计了如下图的头文件;

AdjMGraph.h,涉及到了对图的节点删除和增加,以及打印的等。

还有链表的储存结构,SeqList.h和网路拓扑结构的的文件C:

\Users\Administrator\Desktop\新建文件夹(tuoputu10.txt

 

3.3源代码

AdjMGraph.h

#include"SeqList.h"

 

//邻接矩阵实现图的存储类型定义

typedefstruct

{

SeqListvertices;//存放顶点的顺序表

intedge[MaxVertices][MaxVertices];//存放边的邻接矩阵

intnumOfEdges;//边的数目

}AdjMGraph;//图的结构体定义

typedefstruct

{

introw;//行下标

intcol;//列下标

intweight;//权值

}RowColWeight;//边信息结构体定义

//置带权有向图G为空图

voidGraphInitiate(AdjMGraph*G)

{

inti,j;

for(i=0;i

for(j=0;j

{

if(i==j){

G->edge[i][j]=0;

}

else{

G->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(&G->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))

{

printf("插入边时参数v1和v2越界出错!

\n");

exit

(1);

}

G->edge[v1][v2]=weight;

G->edge[v2][v1]=weight;

G->numOfEdges++;

}

}

 

//在带权有向图G中删除一条第v1个顶点指向第v2个顶点的边。

voidDeleteEdge(AdjMGraph*G,intv1,intv2)

{

G->edge[v1][v2]=MaxWeight;

G->edge[v2][v1]=MaxWeight;

G->numOfEdges--;

}

 

//删除顶点

//在带权有向图G中删除第v个顶点,时间复杂度:

O(n^2)。

voidDeleteVertex(AdjMGraph*G,intv)

{

intm3,i,j;

m3=v-1;

if(m3<0||m3>=G->vertices.size)

{

printf("对不起,此链路内没有您想要删除的路由节点\n");

exit(0);

}

else

{

//for(i=m3;ivertices.size;i++)

for(j=0,i=m3;jvertices.size;j++)

{

G->edge[j][i]=MaxWeight;

}

//for(i=m3;ivertices.size;i++)

for(i=m3,j=0;jvertices.size;j++)

G->edge[i][j]=MaxWeight;

//for(i=m3;ivertices.size;i++)

//G->vertices.list[i]=G->vertices.list[i]-1;

//G->vertices.size--;

//printf("删除结点成功\n");

}

}

//有没有向是一样的。

//在带权有向图G中取第v个顶点的第一个邻接顶点,如果这样的邻接顶点存在,则返回该顶点在顶点顺序表的序号,否则返回-1.时间复杂度:

O(n)。

intGetFirstVex(AdjMGraphG,intv)

{

intcol;DataTypex;

v=v-1;

if(ListGet(G.vertices,v,&x)==0)

{

printf("取第一个邻接顶点时参数v越界出错!

\n");

exit

(1);

}

//寻找邻接矩阵v行中从最左开始第一个值非零且非无穷大的权值对应的顶点

for(col=0;col

if(G.edge[v][col]>0&&G.edge[v][col]

returncol;

return-1;

}

//在带权有向图G中取第v1个顶点的继邻接结点第v2个顶点之后的下一个邻接结点,时间复杂度:

O(n)。

intGetNextVex(AdjMGraphG,intv1,intv2)

{

intcol;DataTypex;

if((ListGet(G.vertices,v1,&x)==0)||(ListGet(G.vertices,v2,&x)==0))

{

printf("取下一邻接顶点时参数v1和v2越界出错!

\n");

exit

(1);

}

if(G.edge[v1][v2]==0)

{

printf("v2不是v1的邻接顶点\n");

exit

(1);

}

//寻找邻接矩阵v行中从第v2+1列开始的第一个值非零且非无穷大的权值对应的顶点

for(col=v2+1;col

if(G.edge[v1][col]>0&&G.edge[v1][col]

returncol;

return-1;

}

//创建有向图G,通过在空图G中插入n个顶点和e条边实现。

时间复杂度:

O(n^2+e)。

voidCreatGraph(AdjMGraph*G,DataTypev[],intn,RowColWeightW[],inte)

{

inti,k;

GraphInitiate(G);

for(i=0;i

{

//cout<

InsertVertex(G,v[i]);

}

for(k=0;k

InsertEdge(G,W[k].row,W[k].col,W[k].weight);

}

 

//迪克特斯拉算法求得是最短路径和相应的路由器

voidDijkstra(AdjMGraph*G,intv0,intdistance[],intpath[])

/*带权图G从下标0顶点到其它顶点的最短距离distance*/

/*和最短路径上顶点前驱下标path*/

{

intn=G->vertices.size;

int*S=(int*)malloc(sizeof(int)*n);//S数组

intminDis,i,j,u;

FILE*fp;

/*初始化*/

for(i=0;i

{

distance[i]=G->edge[v0][i];

S[i]=0;

if(i!

=v0&&distance[i]

path[i]=v0;

elsepath[i]=-1;

}

S[v0]=1;

/*在当前还未找到最短路径的顶点集中选取具有最短距离的顶点u*/

for(i=1;i

{

minDis=MaxWeight;

for(j=0;j

if(S[j]==0&&distance[j]

{

u=j;

minDis=distance[j];

}

/*当已不再存在路径时算法结束*/

if(minDis==MaxWeight)return;

S[u]=1;/*标记顶点u已从集合T加入到集合S中*/

/*修改从v0到其它顶点的最短距离和最短路径*/

for(j=0;j

if(S[j]==0&&G->edge[u][j]

distance[u]+G->edge[u][j]

{

d

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1