C语言实现路径矢量路由算法和链路状态路由算法

C语言实现路径矢量路由算法和链路状态路由算法_第1张图片
C语言实现路径矢量路由算法和链路状态路由算法_第2张图片
C语言实现路径矢量路由算法和链路状态路由算法_第3张图片
C语言实现路径矢量路由算法和链路状态路由算法_第4张图片

#include
#include
#include
#include

//定义结构体
struct node{
	
	int d_num;//跳数
	int d_next;//下一跳节点
	
};


//定义链路状态算法的结构体
struct lsnode{
	int visited;//1代表已访问
	char path[40];//路径
	int index;//路径字符数量
}lsn[40];

int main(){
	struct node no_1[40][40], no_2[40][40];
	int N=0,num=0;
	int flag=0;//是否有节点出现,链路状态路由算法在所有节点都已经访问完成or找到目标节点的最短路径的时候结束
	int f1=0,f2=1,f3=0;//是否满足交换条件的标志
	int i=0,j=0,k=0,r=0,rl=0,m=0,n=0;
	int min=0;//寻找权值最小的节点
	int temp;
	int quan;
	char begin,end;
	int beginNode=0,endNode=0;
	
	char map[40][40];//坐标图
	int node[50][2];//节点的坐标,最多100个节点,0横坐标、1纵坐标
	int nearNodes[40][2];//2个相邻节点保存在数组
	int nearnum=0;//相邻节点数组的大小
	int topmap[40][40];//双向图二维表
	struct node *routeHeaders[40];//保存每个链表的头指针
	struct node *copyHeaders[40];//复制每个链表的头指针
	typedef struct node* np;//开辟节点内存用到
	struct node *p, *p1, *p2, *p3, *p4, *p5;//添加节点用到
	
	//初始化40*40的地图
	for(i=0;i<40;i++){
		for(j=0;j<40;j++){
			map[i][j]='*';
			//printf("* ");
			if(i != j)topmap[i][j]=10000;
			else topmap[i][j]=0;
		}
		//printf("\n");
	}
	printf("请输入节点数量:\n");
	scanf("%d",&N);
	//随机生成坐标
	srand(time(NULL));
	for(i=0;i no_2[nearNodes[i][1]][j].d_num){
									//则更新实际数组
									f3=0;//0表示有改动
									
									no_1[nearNodes[i][0]][k].d_num = no_2[nearNodes[i][1]][j].d_num;
									no_1[nearNodes[i][0]][k].d_next = no_2[nearNodes[i][1]][j].d_next;
								}
							}
						}
					}//for k
					//若目的地不一样(该实际数组元素无效,且备份数组元素有效),且备份数组元素的目的地不是实际数组元素下标
					// && 实际数组的元素不可以是直接交付  && 实际数组的元素必须是还没被用上的 
					if(j!=k && j!=nearNodes[i][0] && no_1[nearNodes[i][0]][j].d_next!=95 && no_1[nearNodes[i][0]][j].d_num==100){
						//则把该副本数组元素添加到实际数组元素,
						//printf("改变%d  %d\n",no_1[nearNodes[i][0]][j].d_num,no_1[nearNodes[i][0]][j].d_next);
						f3=0;//0表示有改动
						
						no_1[nearNodes[i][0]][j].d_num = no_2[nearNodes[i][1]][j].d_num;
						no_1[nearNodes[i][0]][j].d_next = no_2[nearNodes[i][1]][j].d_next;
					}
				}
			}//for j
		}//for i
		//备份数组,进行相关的修改
		for(i=0;i<40;i++){
			for(j=0;j<40;j++){
				if(no_1[i][j].d_num != 100 && no_1[i][j].d_next != 100){
					no_2[i][j].d_num=no_1[i][j].d_num+1;//跳数+1
					no_2[i][j].d_next=i+65;//下一跳改为自己的下标
				}else{
					no_2[i][j].d_num=100;//跳数100
					no_2[i][j].d_next=100;//下一跳100
				}
			}
		}
	
	}//while
	
	//打印数组
	printf("起始节点	终点节点	跳数	下一跳节点(交换次数:%d)\n",num);
	for(i=0;i<40;i++){
		for(j=0;j<40;j++){
			if(no_1[i][j].d_num != 100 && no_1[i][j].d_next != 100){
				printf(" %c\t\t%c\t\t%d\t%c\n",(char)(65+i),(char)(65+j),no_1[i][j].d_num,(char)(no_1[i][j].d_next));
			}
		}
	}
	
	//打印路径
	printf("\n开始节点:%c\t结束节点:%c\n\n",(char)(beginNode),(char)(endNode));
	
	f2=0;
	f3=beginNode;
	if(no_1[f3-65][endNode-65].d_next == 100) printf("%c-->%c没有路径可走",(char)(beginNode),(char)endNode);
	else if(no_1[f3-65][endNode-65].d_next == 95) printf("%c-->%c",(char)(beginNode),(char)endNode);
	else{
		while(f3 != 95){
			f2++;
			if(no_1[f3-65][endNode-65].d_next == 95) break;
			if(f2==1) printf("%c-->%c",(char)f3,(char)no_1[f3-65][endNode-65].d_next);
			else printf("-->%c",(char)no_1[f3-65][endNode-65].d_next);
			f3=no_1[f3-65][endNode-65].d_next;
		}
		printf("-->%c",(char)endNode);
		//else printf("%c-->%c没有路径可走",(char)(beginNode),(char)endNode);
	}
	printf("\n\n\n");


	printf("\n***********************链路状态路由算法*******************************\n\n");
	printf("拓扑图转换为二维表\n");
	
	printf(" ");
	for(i=0;i%c没有最短路径",(char)(beginNode),(char)(endNode));
	else if(topmap[endNode-65][beginNode-65]>0 && topmap[endNode-65][beginNode-65]%c",(char)(beginNode),(char)(endNode));
	else {
		for(j=0;j%c",lsn[endNode-65].path[j]);
		}
	}
	printf("\n\n");

	return 0;
}





你可能感兴趣的:(路由算法)