ﻩﻩif(!
visit[k]&&(min+arcs[v][k]<RL[k])){
ﻩﻩﻩ//modifyshortestr[j]and RL[j]
ﻩﻩﻩRL[k]=min+arcs[v][k];
ﻩﻩﻩﻩupdateRouteLen(R[k],R[v],k,vexnum);
ﻩﻩﻩ}//if
}//for
ﻩdelete[] visit;
ﻩvisit=NULL;
}//Dijkstra
完成核心算法后,对于每个路由器运行一次Dijkstra算法就可以计算出该路由到其他各个路由的最短路径。
四、实验过程及结果
本实验用6个节点进行模拟,首先输入节点个数,再依次输入节点的标识符和到邻居节点的标识符和距离。
以end为结束符。
运行结果如下:
请输入路由节点总个数:
6
请输入路由节点标识符:
a
请输入节点:
a的邻居节点的标识符及其到邻居节点的距离:
b
8
请输入节点:
a的邻居节点的标识符及其到邻居节点的距离:
f
3
请输入节点:
a的邻居节点的标识符及其到邻居节点的距离:
end
请输入路由节点标识符:
b
请输入节点:
b 的邻居节点的标识符及其到邻居节点的距离:
a
8
请输入节点:
b的邻居节点的标识符及其到邻居节点的距离:
c
3
请输入节点:
b 的邻居节点的标识符及其到邻居节点的距离:
f
5
请输入节点:
b的邻居节点的标识符及其到邻居节点的距离:
d
2
请输入节点:
b的邻居节点的标识符及其到邻居节点的距离:
e
4
请输入节点:
b 的邻居节点的标识符及其到邻居节点的距离:
end
请输入路由节点标识符:
c
请输入节点:
c的邻居节点的标识符及其到邻居节点的距离:
b
3
请输入节点:
c的邻居节点的标识符及其到邻居节点的距离:
d
10
请输入节点:
c的邻居节点的标识符及其到邻居节点的距离:
end
请输入路由节点标识符:
d
请输入节点:
d的邻居节点的标识符及其到邻居节点的距离:
c
10
请输入节点:
d 的邻居节点的标识符及其到邻居节点的距离:
b
2
请输入节点:
d的邻居节点的标识符及其到邻居节点的距离:
e
6
请输入节点:
d的邻居节点的标识符及其到邻居节点的距离:
end
请输入路由节点标识符:
e
请输入节点:
e的邻居节点的标识符及其到邻居节点的距离:
b
4
请输入节点:
e的邻居节点的标识符及其到邻居节点的距离:
d
6
请输入节点:
e的邻居节点的标识符及其到邻居节点的距离:
f
4
请输入节点:
e的邻居节点的标识符及其到邻居节点的距离:
end
请输入路由节点标识符:
f
请输入节点:
f的邻居节点的标识符及其到邻居节点的距离:
a
3
请输入节点:
f 的邻居节点的标识符及其到邻居节点的距离:
b
5
请输入节点:
f的邻居节点的标识符及其到邻居节点的距离:
e
4
请输入节点:
f的邻居节点的标识符及其到邻居节点的距离:
End
路由表结果
五、实验心得
本次实验,主要的就是一个著名算法的运用,当然通过本次实验我对链路路由算法也有了进一步的认识与了解。
从这次的实验中我不但学会了一个新的算法,进一步锻炼了我的编程能力而且我也对路由相关内容有了更深刻的了解。
六、附录:
源代码
packagedstverctor;
/**
*描述两个路由节点之间关系的类
*
*/
public classDistanceNode{
ﻩ//publicRouteNodesrc;//源节点
//ﻩpublicDistanceNode(RouteNodesrc){
//this.src =src;
//}
ﻩpublicStringdst;//目标节点
ﻩpublicintdistance;//两者之间的距离
ﻩpublicString path;//经过的第一个路径节点,即线路
publicDistanceNodenext;//下一个节点
ﻩ
ﻩpublicDistanceNode(){
ﻩ
}
publicDistanceNode(Stringdst,intdistance,Stringpath){
ﻩﻩthis.dst = dst;
ﻩthis.distance= distance;
ﻩﻩthis.path=path;
}
ﻩ/**
ﻩ*根据节点标识符,得到路由节点到指定节点的距离
ﻩ*@paramkey指定节点标识符
*@return如果找到,则返回这个关系类节点,否则返回null。
ﻩ *int
*/
public DistanceNodefindNode(Stringkey){
ﻩDistanceNode dn=this;
ﻩﻩwhile(dn!
=null){
ﻩif(dn.dst.equals(key)){
ﻩﻩﻩﻩreturndn;
ﻩﻩ}
dn =dn.next;
ﻩ}
ﻩreturnnull;
}
ﻩ/**
*根据key向链表中修改或增加一个节点,如果存在dst.equal(key)的点并且他的distance大于要插入的distance,则更改其distance,否则向链表末尾插入新节点
ﻩ * @paramkey
*@paramdistance
ﻩ* @param path
*void
ﻩ*/
ﻩpublicvoidaddNode(Stringkey,intdistance,Stringpath){
ﻩDistanceNode dn=findNode(key);
ﻩif(null!
=dn){//如果找到了节点
ﻩif(dn.distance>distance)
ﻩﻩdn.distance= distance;
}else{
ﻩﻩﻩDistanceNodedn1 =this;
ﻩwhile(dn1.next!
=null){
ﻩﻩdn1=dn1.next;
ﻩ}
ﻩﻩDistanceNodenode=newDistanceNode();
ﻩﻩnode.distance=distance;
ﻩnode.dst=key;
node.path= path;
dn1.next=node;
ﻩﻩnode.next=null;
ﻩ}
}
ﻩ
publicvoid print(){
ﻩDistanceNode dn=this;
ﻩSystem.out.println("目地节点:
"+dn.dst+"距离:
"+dn.distance+" 线路:
"+dn.path);
ﻩﻩwhile(dn.next!
=null){
ﻩﻩﻩdn =dn.next;
ﻩﻩSystem.out.println("目地节点:
"+dn.dst+"距离:
"+dn.distance+" 线路:
"+dn.path);
ﻩ}
ﻩ}
}
package dstverctor;
/**
* 描述两个路由节点之间关系的类
*
*/
publicclassDistanceNode {
ﻩ
//publicRouteNodesrc;//源节点
//ﻩpublic DistanceNode(RouteNodesrc){
//ﻩthis.src= src;
//}
publicStringdst;//目标节点
ﻩpublicintdistance;//两者之间的距离
publicStringpath;//经过的第一个路径节点,即线路
publicDistanceNodenext;//下一个节点
ﻩ
ﻩpublicDistanceNode(){
ﻩ
}
publicDistanceNode(Stringdst,intdistance,Stringpath){
ﻩthis.dst=dst;
ﻩﻩthis.distance= distance;
this.path =path;
}
ﻩ
/**
*根据节点标识符,得到路由节点到指定节点的距离
* @paramkey指定节点标识符
ﻩ*@return 如果找到,则返回这个关系类节点,否则返回null。
ﻩ*int
*/
publicDistanceNodefindNode(String key){
ﻩDistanceNodedn=this;
ﻩﻩwhile(dn!
=null){
ﻩﻩif(dn.dst.equals(key)){
ﻩﻩﻩreturndn;
ﻩﻩ}
ﻩdn =dn.next;
ﻩ}
ﻩreturnnull;
}
ﻩ/**
*根据key向链表中修改或增加一个节点,如果存在dst.equal(key)的点并且他的distance大于要插入的distance,则更改其distance,否则向链表末尾插入新节点
*@paramkey
* @param distance
*@parampath
*void
ﻩ*/
ﻩpublic voidaddNode(Stringkey,intdistance,Stringpath){
ﻩﻩDistanceNodedn=findNode(key);
if(null!
=dn){//如果找到了节点
ﻩﻩif(dn.distance>distance)
ﻩdn.distance =distance;
ﻩ}else{
ﻩﻩDistanceNodedn1=this;
ﻩﻩwhile(dn1.next!
=null){
ﻩﻩdn1=dn1.next;
ﻩ}
ﻩDistanceNodenode= newDistanceNode();
ﻩnode.distance=distance;
ﻩﻩﻩnode.dst =key;
ﻩﻩﻩnode.path=path;
ﻩﻩdn1.next=node;
ﻩnode.next=null;
}
}
ﻩ
public voidprint(){
DistanceNodedn=this;
ﻩSystem.out.println("目地节点:
"+dn.dst+"距离:
"+dn.distance+" 线路:
"+dn.path);
ﻩwhile(dn.next!
=null){
ﻩﻩﻩdn=dn.next;
System.out.println("目地节点:
"+dn.dst+" 距离:
"+dn.distance+"线路:
"+dn.path);
ﻩ}
}
}
package dstverctor;
/**
*路由的唯一标识符类
*
*/
publicclassRouteKey{
Stringkey;//路由节点的唯一标识符
RouteKeynext;//路由表中的下一个路由节点
public RouteKey(){
ﻩﻩ
}
ﻩpublicRouteKey(Stringkey){
ﻩthis.key=key;
}
ﻩ
publicvoid print(){
RouteKeyrk = this;
ﻩSystem.out.print(rk.key+"||");
ﻩwhile(rk.next!
=null){
ﻩrk=rk.next;
ﻩﻩSystem.out.print(rk.key+"||");
ﻩ}
ﻩ}
}
packagedstverctor;
/**
*路由节点
*/
publicclassRouteNode{
ﻩDistanceNode old;//老路由表
ﻩDistanceNodecurrent;//新路由表
RouteKeyneighbour;//存储邻居节点的链表头结点
Stringkey;
ﻩ//跟新路由表
publicvoidupdateCurrent(){
ﻩsaveCurrent();//路由表变化前保存当前的路由表
ﻩﻩRouteNodenb;//邻居节点
ﻩRouteKeyrk=neighbour;
ﻩwhile(null!
=rk){
ﻩﻩ//System.out.println("------------"+rk.key+"-------");
ﻩﻩnb=DistVerctor.map.get(rk.key);//由节点标记符得到路由节点
ﻩﻩ//System.out.println("------------"+nb.key+"-------");
ﻩﻩDistanceNodedn=nb.old;//得到邻居节点的老路由表
ﻩ//排除自己在内,避免重新计算自己到邻居节点
ﻩﻩif(dn.dst.equals(key)){ﻩ
ﻩSystem.out.println("------------"+dn.dst+"------------");
ﻩﻩdn= dn.next;
ﻩﻩ
ﻩﻩ}
ﻩﻩint distTonb=0;
ﻩﻩ
ﻩif(dn!
=null)
distTonb=current.findNode(nb.key).distance;//到邻居节点的距离
ﻩwhile(null!
=dn){
ﻩﻩ//排除自己在内,避免重新计算自己到邻居节点
ﻩﻩif(dn.dst.equals(key)){
ﻩﻩﻩSystem.out.println("------------"+dn.dst+"------------");
ﻩﻩﻩdn=dn.next;
ﻩ
ﻩﻩﻩ}else{
ﻩﻩﻩ//修改新路由表,
ﻩ//如果当前节点到dn的距离小于当前节点到邻居节点nb+nb到dn的距离,则修改路由表
ﻩ//如果不存在当前节点到dn的路径,则在路由表最后新添加该路径
ﻩﻩﻩcurrent.addNode(dn.dst,dn.distance+distTonb, nb.key);
ﻩﻩﻩdn= dn.next;
ﻩﻩ}
ﻩ}
rk=rk.next;//指向下一个邻居节点
}
ﻩ}
/**
*将当前表保存为旧表
ﻩ *
ﻩ* void
ﻩ*/
publicvoidsaveCurrent(){
DistanceNodecnode=current;
ﻩDistanceNodeonode=new DistanceNode();
ﻩﻩcopy(cnode,onode);//得到cnode的备份
old =onode;
ﻩﻩwhile(cnode.next!
=null){
ﻩﻩonode.next=newDistanceNode();
ﻩcopy(cnode.next,onode.next);
cnode=cnode.next;
ﻩonode=onode.next;
ﻩ}
ﻩ}
publicvoidcopy(DistanceNodesrc,DistanceNode dst){
ﻩdst.distance =src.distance;
ﻩdst.dst = src.dst;
ﻩﻩdst.path= src.path;
ﻩ}
ﻩpublicvoidprint(){
ﻩSystem.out.println(key+"的邻居节点:
");
neighbour.print();
ﻩﻩSystem.out.println("老路由表:
");
ﻩold.print();
System.out.println("新路由表:
");
ﻩﻩcurrent.print();
}
}