距离向量算法模拟程序:优化用户界面
#include <stdio.h> #include <stdlib.h> #include <string.h>
//定义路由表结构RTable typedef struct node { char dstNet[5]; int distance; char nextSkip[5]; } RTable;
RTable RT1[1000]; //当前路由器路由表 RTable RT2[1000]; //相邻路由器的路由表
int l1, l2; //记录RT1[]和RT2[]的长度
//基于当前路由器的路由表初始化函数 void InitRTable(RTable *RT) { printf("请为当前路由器添加路由表项(目的网络 距离 下一跳路由器):\n"); int i; for (i = 0; i < 1000; ++i) { scanf("%s%d%s", RT[i].dstNet, &RT[i].distance, RT[i].nextSkip);
if (RT[i].distance == 0)
{
break;
}
}
l1 = i; //记录RT1[]的长度
}
//相邻路由器添加函数 void AddNearRouter(char *nearR) { printf("\n请输入相邻路由器名称:\n"); scanf("%s", nearR); }
//基于相邻路由器的路由表初始化函数 void InitNearRTable(RTable *RT2, char *nearR) { printf("\n请为相邻路由器%s添加路由表项(目的网络 距离 下一跳路由器):\n", nearR); int i; for (i = 0; i < 1000; ++i) { scanf("%s%d%s", RT2[i].dstNet, &RT2[i].distance, RT2[i].nextSkip);
if (RT2[i].distance == 0)
{
break;
}
}
l2 = i; //记录RT2[]的长度
}
//路由信息修改函数 void UpdateNearRTable(RTable *RT2, char *nearR) { int p; for (p = 0; p < l2; ++p) { RT2[p].distance = RT2[p].distance + 1; strcpy(RT2[p].nextSkip, nearR); } }
//路由表更新函数 void UpdateRTable(RTable *RT1, RTable *RT2) { int p, q; //p——RT2[],q——RT1[] for (p = 0; p < l2; ++p) { int finded = 0; for (q = 0; q < l1; ++q) { if (strcmp(RT2[p].dstNet, RT1[q].dstNet) == 0) { //当前表中找到与发来的表目的网络相同的一条路由信息 finded = 1; if (strcmp(RT1[q].nextSkip, RT2[q].nextSkip) == 0) { //下一跳路由器正好是这个相邻路由器 RT1[q].distance = RT2[p].distance; } else { //下一跳路由器不是这个 if (RT2[p].distance + 1 < RT1[q].distance) { RT1[q].distance = RT2[p].distance; strcpy(RT1[q].nextSkip, RT2[q].nextSkip); } } } } if (!finded) { //当前表中没有这条路由信息,就加上 strcpy(RT1[l1].dstNet, RT2[p].dstNet); RT1[l1].distance = RT2[p].distance; strcpy(RT1[l1].nextSkip, RT2[p].nextSkip);
++l1;
}
}
}
//路由表打印函数 void PrintRTable(RTable *RT, int len) { printf(" 目的网络 距离 下一跳路由器\n"); int i; for (i = 0; i < len; ++i) { printf(" %s %d %s\n", RT[i].dstNet, RT[i].distance, RT[i].nextSkip); } printf("------------------------------------- "); }
int main() { printf("\n-----------距离向量算法的过程模拟------------\n\n");
//初始化当前路由器
InitRTable(RT1);
while (1)
{
printf("\n-----------是否有新的路由信息(0为否,1为是)------------\n\n");
int choose;
scanf("%d", &choose);
if (choose == 1)
{
char nearR[5];
//添加相邻路由器
AddNearRouter(nearR);
//初始化相邻路由器
InitNearRTable(RT2, nearR);
//打印当前路由表
printf("\n----------当前路由器的路由表---------
"); PrintRTable(RT1, l1);
//打印相邻路由表
printf("\n----------相邻路由器的路由表---------
"); PrintRTable(RT2, l2);
//打印修改后的路由信息
printf("\n-------修改后的路由信息------\n");
UpdateNearRTable(RT2, nearR);
PrintRTable(RT2, l2);
//进行路由表更新
UpdateRTable(RT1, RT2);
//打印更新后的路由表
printf("\n-------当前路由器更新后的路由表------\n");
PrintRTable(RT1, l1);
}
else if (choose == 0)
{
break;
}
}
printf("\n-----------更新完毕------------\n\n");
return 0;
}
原文地址: https://www.cveoy.top/t/topic/ocHt 著作权归作者所有。请勿转载和采集!