四.实验设备与实验环境
实验设备:笔记本电脑一台 实验环境:Visual C++ 6.0
五.实验总结
此次完成的路由算法是链路状态路由算法,编程代码上参考了网上的资料,但总体上把握很清楚,因为这个存储结构及dijkstra算法在数据结构中已经练习过很多次,之前也有完成相应的代码,所以在完善成链路状态路由算法的时候也是起到了相当大的作用,主要是对该算法进一步的了解及剖析,然后才能完成这个完善过程。但总体来说,其实并不是特别完美,只是一个简化版的实现,但主要是完成了实验的规定内容及增强了对链路状态路由算法的了解。希望以后接触到这个方面的时候能更加熟练,且进一步完成今日的工作。
(附源代码)
#include
#define routeTable %using namespace std;
const int MAX_NODES = 1024; //能接受的最大路由数 const int INFINITY = 100000; //权值
int dist[MAX_NODES][MAX_NODES]; //用于存放网络拓扑结构连接矩阵 int static Vnums; //总的节点(路由)数
void initDist(){ //初始化邻接矩阵
for(int i = 0; i < MAX_NODES; i ++) for(int j = 0; j < MAX_NODES; j ++) dist[i][j] = 0; }
void creatRouteMap(int Vnums){ //创建网络拓扑结构的邻接矩阵 ,1.创建路由表函数 for(int i = 0; i < Vnums; i ++) {
cout << \输入第\个节点\\n\ for(int j = 0; j < Vnums; j ++) { cout <<\的第\个节点的权值:\ cin >> dist[i][j]; } } }
void saveRoute(ofstream& routeTables){ //6.保存路由信息 routeTables << \路由邻接矩阵为:\ routeTables << \
routeTables << \ routeTables << \ for(int i = 0; i < Vnums; i ++) { for(int j = 0; j < Vnums; j ++) { routeTables< routeTables << \ } } void dijkstra(int s, int t, int path[]){ //迪杰斯特拉算法 s目的节点 t源节点 struct state{ //存放节点数据 int predecessor; //父节点 int length; //权值,存放最小权值 bool lable; //访问状态 false未被访问过,true访问过 }state[MAX_NODES]; int i,k,min,print; struct state *p; for(p = &state[0]; p < &state[Vnums]; p ++) //初始化节点数据 { p->predecessor = -1;//类似存下一跳 p->length = INFINITY; //=100000 p->lable = false; } state[t].length = 0; //源节点的权值改为0 state[t].lable = true; k = t; cout << \最短路径为:\ do{ //dowhile 先是把所有最短路径连起来 for(i = 0; i < Vnums; i ++) //找到与永久标定节点直接相连的节点,并改变其权值 { if( (dist[k][i] != 0) && (state[i].lable == false)) { //与源节点直接相连并且不是同一个源节点k源节点 if(state[k].length + dist[k][i] < state[i].length) { state[i].predecessor = k; //记录节点 cout << k << \ state[i].length = state[k].length + dist[k][i]; //路径长度总和 } } } k = 0; min = INFINITY; for( i = 0; i < Vnums; i ++) //找到与永久标定节点相邻的节点,并把与最小权值的相邻点改为永久标点 { if((state[i].lable == false) && (state[i].length < min)) //找到与永久标点相邻的节点 { min = state[i].length; k = i; } } state[k].lable = true; //新的永久标点也变为访问过 }while(k!=s); //新的永久标点是否为目的节点,不是继续循环 cout << s <<\最小距离=\ } void addRoute(){ //添加一个路由及结点信息2.增加路由 char ch; do{ cout << \添加一个路由:\ Vnums = Vnums + 1; cout << \输入第\个节点与第\ for(int j = 0; j < Vnums; j ++) { cout << j << \个节点的权值:\ cin >> dist[Vnums - 1][j]; //写入对应增加行的信息 dist[j][Vnums - 1] = dist[Vnums - 1][j]; //写入对应增加列的信息 } cout << \继续添加(y 或者 n):\ cin >> ch; if(ch == 'n') break; }while(ch == 'y'); } void deleteRoute(){ //3.删除路由 char ch; int delNum; do{ cout << \输入删除路由结点号:\ cin >> delNum; for(int j = 0; j < Vnums; j ++) { dist[delNum - 1][j] = 0; //对应行的信息 dist[j][delNum - 1] = dist[delNum - 1][j]; //对应列的信息 } cout << \继续删除(y 或者 n):\ cin >> ch; if(ch == 'n') break; }while(ch == 'y'); } void changeRoute(){ //4.修改路由 int i,j; cout << \输入要修改的结点1:\ cin >> i; cout << \输入要修改的结点2:\ cin >> j; cout << \输入修改的权值:\ cin >> dist[i-1][j-1]; } void displayRouteInfo(){ //7.显示路由表信息 cout << \ cout << \路由表信息:\ cout<<\ for(int j=0;j cout<<\ //显示ABC..的对应数字为012.. cout<<\目的节点)\\n\ for(int i = 0; i < Vnums; i ++) { int c=i+65; cout<<(char)c<<\ for(int j = 0; j < Vnums; j ++) { cout << dist[i][j] << \ } cout << \ } } int main(){ int desNode,rouNode; int path[MAX_NODES]; int change; char ch; ofstream routeTables; //初始化权值矩阵 initDist(); cout << \输入路由总节点数:\ cin >> Vnums; do{ //主菜单界面 cout << \ cout << \创建路由表\ cout << \增加路由\ cout << \删除路由\ cout << \修改路由\ cout << \找两个路由间的最短路径\ cout << \保存路由表到文件\ cout << \显示路由表信息\ cout << \退出\ cout << \ cout << \选择操作(1-8):\ cin >> change; switch(change) { case 1: creatRouteMap(Vnums); system(\ case 2: addRoute(); system(\ case 3: deleteRoute(); system(\