定义的结构体是这个struct Route{ int rt_ifnum;/* 接口号,全局变量netif中的下标对应 */ uint32 rt_net;/* 目标网络 */ uint32 rt_mask;/* 子网掩码 */ uint32 rt_nexthop;/* 下一跳地址 */ int rt_distance;/*路径距离*/ struct Route *rt_next;/* 路由链表的下一条记录 */ };根据这个结构体帮我完善下面这个代码,直接给代码就行:struct Route* adj_update_routetable(struct Route *rtinfo, struct Route *adj_rtinfo) { struct Route *res = rtinfo; /***************** Begin 1 *****************/ /***************** End 1 *******************/ return res; }
时间: 2023-07-01 14:19:17 浏览: 178
下面是完善后的代码:
struct Route* adj_update_routetable(struct Route *rtinfo, struct Route *adj_rtinfo) {
struct Route *res = rtinfo;
struct Route *p = rtinfo; // 定义指针p指向路由表头部
struct Route *q = adj_rtinfo; // 定义指针q指向邻居路由表头部
// 遍历邻居路由表,将邻居路由表的信息添加到本地路由表中
while (q != NULL) {
// 在本地路由表中查找目标网络
while (p != NULL && p->rt_net != q->rt_net) {
p = p->rt_next;
}
if (p == NULL) { // 如果本地路由表中没有目标网络,则添加该路由信息
struct Route *new_rt = (struct Route *)malloc(sizeof(struct Route));
new_rt->rt_ifnum = q->rt_ifnum;
new_rt->rt_net = q->rt_net;
new_rt->rt_mask = q->rt_mask;
new_rt->rt_nexthop = q->rt_nexthop;
new_rt->rt_distance = q->rt_distance + 1; // 距离加1
new_rt->rt_next = res;
res = new_rt;
} else { // 如果本地路由表中已经有目标网络,则更新该路由信息
if (p->rt_distance > q->rt_distance + 1) { // 如果新路由距离更短,则更新该路由信息
p->rt_ifnum = q->rt_ifnum;
p->rt_nexthop = q->rt_nexthop;
p->rt_distance = q->rt_distance + 1; // 距离加1
}
}
q = q->rt_next;
p = rtinfo; // 指针p重新指向路由表头部
}
return res;
}
阅读全文