1. 程式人生 > >透明網橋的自學習演算法

透明網橋的自學習演算法

#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);
      }
}