透明網橋的自學習演算法
阿新 • • 發佈:2019-02-17
#include<stdio.h> void main() { char arr1[3]={'A','B','C'}; char arr2[2]={'D','E'}; char arr3[3]={'F','G','H'}; int a[][2]={0,0,0,0,0,0,0,0,0,0,0,0}; int b[][2]={0,0,0,0,0,0,0,0,0,0,0,0}; int i,j,m,n,k1 = 0,k2 = 0,t; char s,d,k; while(1) { printf("請輸入源地址和目的地址:"); scanf("%c%c",&s,&d); printf("\n"); for(i=0;i<3;i++){ if(arr1[i]==s) m=1; } for(i=0;i<2;i++){ if(arr2[i]==s) m=2; } for(i=0;i<3;i++){ if(arr3[i]==s) m=3; } switch(m) { case 1: { for(i=0;i<k1;i++){ if(a[i][0]==s) {break;} } if(i==k1) {a[k1][0]=s;a[k1][1]=m;k1++;}//沒有記錄,在網橋陣列中插入源地址 for(i=0;i<k1;i++)//查詢網橋陣列中是否有目的地址 { if(a[i][0]==d) { n=a[i][1]; break; } } if(i==k1) printf("網橋1中沒有目的記錄%c,向右轉發\n",d);//不含有,轉發 else { if(m==n){ printf("網橋1丟棄\n");t=1; }//含有且在同在網段丟棄 else printf("不在同一網段,網橋1向右轉發\n");//含有不在同一網段轉發 } if(t!=1) //不在同一網段時 { for(i=0;i<k1;i++) if(b[i][0]==s) {break;} if(i==k1) {b[k2][0]=s;b[k2][1]=m;k2++;}//沒有記錄,在網橋陣列中插入源地址 for(i=0;i<k1;i++)//查詢網橋陣列中是否有目的地址 {if(b[i][0]==d) {n=b[i][1]; break;}} if(i==k2) printf("網橋2中沒有目的記錄%c,向右轉發\n",d);//不含有,轉發 else { if(m==n) printf("網橋2丟棄\n");//含有且在同在網段丟棄 else printf("不在同一網段,網橋2向右轉發\n");//含有不在同一網段轉發 } } break; } case 2: { //向左轉發 for(i=0;i<k1;i++) if(a[i][0]==s) {break;} if(i==k1) {a[k1][0]=s;a[k1][1]=m;k1++;}//沒有記錄,在網橋陣列中插入源地址 for(i=0;i<k1;i++)//查詢網橋陣列中是否有目的地址 {if(a[i][0]==d) {n=a[i][1]; break;}} if(i==k1) printf("網橋1中沒有目的記錄%c,向左轉發\n",d);//不含有,轉發 else { if(m==n) printf("網橋1丟棄\n");//含有且在同在網段丟棄 else printf("不在同一網段,網橋1向左轉發\n");//含有不在同一網段轉發 } //向右轉發 for(i=0;i<k2;i++) if(b[i][0]==s) {break;} if(i==k2) {b[k2][0]=s;b[k2][1]=m-1;k2++;}//沒有記錄,在網橋陣列中插入源地址 for(i=0;i<k2;i++)//查詢網橋陣列中是否有目的地址 {if(b[i][0]==d) {n=b[i][1]; break;}} if(i==k2) printf("網橋2中沒有目的記錄%c,向右轉發\n",d);//不含有,轉發 else { if(1==n) printf("網橋2丟棄\n");//含有且在同在網段丟棄 else printf("不在同一網段,網橋2向右轉發\n");//含有不在同一網段轉發 } break; } case 3: { for(i=0;i<k2;i++) if(b[i][0]==s) {break;} if(i==k2) {b[k2][0]=s;b[k2][1]=m-1;k2++;}//沒有記錄,在網橋陣列中插入源地址 for(i=0;i<k2;i++)//查詢網橋陣列中是否有目的地址 {if(b[i][0]==d) {n=b[i][1]; break;}} if(i==k2) printf("網橋2中沒有目的記錄,向左轉發\n");//不含有,轉發 else { if(2==n) {printf("網橋2丟棄\n");t=1;}//含有且在同在網段丟棄 else printf("不在同一網段,網橋2向左轉發\n");//含有不在同一網段轉發 } if(t!=1)//不在同一網段時 { for(i=0;i<k1;i++) if(a[i][0]==s) {break;} if(i==k1) {a[k1][0]=s;a[k1][1]=m-1;k1++;}//木有記錄,在網橋陣列中插入源地址 for(i=0;i<k1;i++)//查詢網橋陣列中是否有目的地址 {if(a[i][0]==d) {n=a[i][1]; break;}} if(i==k1) printf("網橋1中沒有目的記錄%c,向左轉發\n",d);//不含有,轉發 else { if(2==n) printf("網橋1丟棄\n");//含有且在同在網段丟棄 else printf("不在同一網段,網橋1向左轉發\n");//含有不在同一網段轉發 } } break; } default: ; } putchar('\n'); printf("網橋1\n"); printf("--------\n"); for(i=0;i<k1;i++) {printf(" %c ",a[i][0]); printf("%d ",a[i][1]); putchar('\n'); } printf("--------\n"); printf("網橋2\n"); printf("--------\n"); for(i=0;i<k2;i++) {printf(" %c ",b[i][0]); printf("%d ",b[i][1]); putchar('\n'); } printf("-------\n"); scanf("%c",&k); } }