路由表生成程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
路由表
3.1任务要求
3.1.1需求分析
给定图的拓扑,每个组有小差别,然后从拓扑输入、任意去掉边、定点,指定路由器号,生成其路由表并输出。
3.1.2要求
使用文件保存网络的拓扑结构,数据格式自己定义;
使用C语言编写路由表生成程序,程序运行后,根据用户选择去掉的边、定点等,重新生成路由表,输出到屏幕并保存到文件;
整个程序由小组分工完成,利用VSource Safe同步保存各自代码至同一服务器上。
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"
//邻接矩阵实现图的存储类型定义
typedef struct
{
SeqList vertices; //存放顶点的顺序表
int edge[MaxVertices][MaxV ertices];//存放边的邻接矩阵
int numOfEdges; //边的数目
}AdjMGraph;//图的结构体定义
typedef struct
{
int row; //行下标
int col; //列下标
int weight; //权值
}RowColWeight;//边信息结构体定义
//置带权有向图G为空图
void GraphInitiate(AdjMGraph *G)
{
int i,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)。 void InsertVertex(AdjMGraph *G,DataType vertex) { //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)。 上面插入的是有向边,我们插入无向边的时候可以进行两次的有向边的插入。 */ void InsertEdge(AdjMGraph *G,int v1,int v2,int weight) { DataType x; 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个顶点的边。 void DeleteEdge(AdjMGraph *G,int v1,int v2) { G->edge[v1][v2]=MaxWeight; G->edge[v2][v1]=MaxWeight; G->numOfEdges--; } //删除顶点 //在带权有向图G中删除第v个顶点,时间复杂度:O(n^2)。 void DeleteVertex(AdjMGraph *G,int v) { int m3,i,j; m3=v-1; if(m3<0||m3>=G->vertices.size) { printf("对不起,此链路内没有您想要删除的路由节点\n"); exit(0); } else { // for(i=m3;i for(j=0,i=m3;j { G->edge[j][i]=MaxWeight; } // for(i=m3;i for(i=m3,j=0;j G->edge[i][j]=MaxWeight; // for(i=m3;i // G->vertices.list[i]=G->vertices.list[i]-1; // G->vertices.size--; // printf("删除结点成功\n"); } } //有没有向是一样的。 //在带权有向图G中取第v个顶点的第一个邻接顶点,如果这样的邻接顶点存在,则返回该顶点在顶点顺序表的序号,否则返回-1.时间复杂度:O(n)。 int GetFirstVex(AdjMGraph G,int v) { int col;DataType x; v=v-1; if(ListGet(G.vertices,v,&x)==0) { printf("取第一个邻接顶点时参数v越界出错!\n"); exit(1);