中级会员
 
- 积分
- 361
- 金钱
- 361
- 注册时间
- 2015-12-26
- 在线时间
- 115 小时
|
这个算法不知道有没有错
//路由表格式
//节点地址 路径
// 30 45 56 78 99
// 33 68 99
// 55 45 82 99
//30是本节点父级;
//99是30节点父级
//78是99节点父级
//56是78节点父级
//45是56节点父级;45是源节点
//如当前节点(32)发送数据到节点30和节点45
//发送数据到节点30
//32-->30路径最短 直接发送
//发送数据到节点45
//路径1
//32-->30-->99-->78-->56-->45路径最远 经过4跳
//路径2
//32-->55-->99-->82-->45路径近 经过3跳
u8 Pro_FindNodePath(u8 node)//查找节点最短路径
{
PathTable path_table[MAX_NODE_NUM];
u8 i,j,k,n,min,addr;
Pro_MemSet((BYTE *)&path_table,0,sizeof(PathTable)*MAX_NODE_NUM);
for(i=0; i<MAX_NODE_NUM; i++)//遍历节点列表
{
if(route_table[i].node_state==VALID)
{
if(route_table[i].node_addr==node)
{
return route_table[i].node_addr;//32-->30路径最短 立即返回
}
else
{
for(j=0; j<MAX_PATH_NUM; j++)//遍历路径表
{
if(route_table[i].path[j]==node)//在路径表找到地址
{
n=0;
for(k=j; k<MAX_PATH_NUM; k++)//遍历路径表
{
if(route_table[i].path[j])//有地址
{
n++;//(路径1)32-->45路径最远 索引=3 (路径2)32-->45 索引=2
}
}
for(k=0; k<MAX_NODE_NUM; k++)//遍历路径索引表
{
if(!path_table[k].addr)//找到空位
{
path_table[k].idx=n;//保存路径索引 (路径1)32-->45路径最远 索引=3 (路径2)32-->45路径最远 索引=2
path_table[k].addr=route_table[i].node_addr;//保存节点地址
break;
}
}
break;
}
}
}
}
}
for(i=0; i<MAX_NODE_NUM; i++)//遍历路径索引表
{
if(path_table[i].addr)//有节点地址
{
min=path_table[i].idx;
addr=path_table[i].addr;
break;
}
}
if(MAX_NODE_NUM==i)//没有节点地址
return 0xFF;
for(i=0; i<MAX_NODE_NUM; i++)//遍历路径索引表
{
if(path_table[i].addr)//有节点地址
{
if(path_table[i].idx<min)//查找最小索引号
{
min=path_table[i].idx;
addr=path_table[i].addr;
}
}
}
return addr;//返回节点地址(下一跳地址)55 //32-->55-->99-->82-->45路径近
}
|
|