Tag: Distributed Algorithms – Ring Orientation

  • Distributed Algorithms – Ring Orientation

    C Code

    File Main.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    #include “list.c”

    void main()
    {
    int i,megethos,id,num_arx,*arx,*temp,j,vrethike,k,messages,p,q,random_num,allagi;
    char state[5];
    int **link;
    typos_deikti prodeiktis,arxi;
    typos_deikti *riza;

            printf(“Doste to megethos tou daktiliou:\n”);
    scanf(“%d”,&megethos);

            riza=malloc(megethos*sizeof(typos_deikti));

            //—————-Desmeusi pinaka 2-diastaseon gia ta links
    link = (int **) malloc(megethos*sizeof(int));
    for(i=0;i < megethos;i++)
    {
    link[i] = malloc(megethos*sizeof(int));
    }
    //——————-Arxikopoiisi tou pinaka ton links me 0
    //—————— link[p][q] = epomenos = 1
    //——————-link[p][q] = proigoumenos = 0
    for(i=0;i < megethos;i++)
    {
    for(j=0;j < megethos;j++)
    {
    link[i][j] = 0;
    }
    }

            dimiourgia(riza);
    prodeiktis=NULL;

            sprintf(state,”recei”);
    id = 1;
    eisagogi(riza,state,id,prodeiktis);
    prodeiktis = *riza;

            for(i=0;i<megethos-1;i++)
    {
    id++;
    eisagogi(riza,state,id,prodeiktis);
    proxorise(&prodeiktis);
    }

            printf(“\nEpilextikan tixaia oi parakato komvoi senders:\n”);
    num_arx=fmod(rand(),megethos);
    arx=malloc(num_arx*sizeof(int));
    temp=malloc(num_arx*sizeof(int));
    for(i=0;i<num_arx;i++)
    {
    arx[i] = fmod(rand(),megethos);
    for(j=0;j<num_arx;j++)
    {
    if(temp[j]==arx[i])
    {
    vrethike=1;
    break;
    }
    else
    {
    vrethike=0;
    }
    }

                if(vrethike==0)
    {
    temp[i] = arx[i];
    printf(“%d\n”,arx[i]);

                    prodeiktis = *riza;
    for(k=0;k<arx[i];k++)
    {
    proxorise(&prodeiktis);
    }
    sprintf(prodeiktis->state,”sende”);

                    //—————-Enimerosi ton links gia tin kateuthnisi ton senders——————//
    if(arx[i]!=0 && arx[i]!=megethos-1)
    {
    p=arx[i];
    q=arx[i]+1;
    random_num = fmod(rand(),2);
    if (random_num ==0)
    {
    link[p][q] = 1;
    }
    else
    {
    link[p][q-2] = 1;
    }
    }
    else if(arx[i]==0)
    {
    p=0;
    q=1;
    link[p][q] = 1;
    }
    else
    {
    p=megethos-1;
    q=0;
    link[p][q] = 1;
    }

                }
    else
    {
    i–;
    }
    }

            //————–SET SUCC-PRED TO RECEIVERS————//
    prodeiktis = *riza;
    for(i=0;i<megethos;i++)
    {
    if(strcmp(prodeiktis->state,”recei”)==0)
    {
    //Receiver = Node 0
    if(i==0)
    {
    link[i][1]=1;
    link[i][megethos-1]=0;
    }
    //Receiver = Last Node
    if(i==megethos-1)
    {
    link[i][0]=1;
    link[i][i-1]=0;
    }
    else
    {
    link[i][i+1]=1;
    link[i][i-1]=0;
    }
    }
    proxorise(&prodeiktis);
    }

            //———Tipose arxiki katastasi———-//
    printf(“Katastasi Komvon Daktiliou\n”);
    printf(“————————–\n”);
    prodeiktis = *riza;
    for(i=0;i<megethos;i++)
    {
    printf(“Komvos %d : “,i);
    printf(“ID = %d “,node_id(prodeiktis));
    printf(“State = %s\n”,periexomeno(prodeiktis));
    proxorise(&prodeiktis);
    }

            //———-Tipose ta links—————–//
    printf(“Pinakas Zeukseon Succ kai Pred metaksi komvon\n”);
    printf(“———————————————\n”);
    for(i=0;i < megethos;i++)
    {
    for(j=0;j < megethos;j++)
    {
    printf(“%d “,link[i][j]);
    }
    printf(“\n”);
    }
    printf(“Kateuthinseis zeukseon metaksi komvon\n”);
    printf(“————————————-\n”);
    for(i=0;i < megethos;i++)
    {
    for(j=0;j < megethos;j++)
    {
    if(link[i][j] == 1)
    {
    printf(“%d->%d\n”,i,j);
    }
    }
    }

            //———–Ring Orientation—————-//
    allagi =1;
    messages=0;
    prodeiktis = *riza;
    while(allagi==1)
    {
    allagi=0;

                for(i=0;i<megethos-2;i++)
    {
    ////////Kainouria fasi – allagi katastaseon////////

                    if (prodeiktis->temp == 1)
    {
    sprintf(prodeiktis->state,”sende”);
    }
    if (prodeiktis->temp == 2)
    {
    sprintf(prodeiktis->state,”recei”);
    }
    if (prodeiktis->temp == 3)
    {
    sprintf(prodeiktis->state,”inter”);
    }

                    ///////////////
    if((strcmp(prodeiktis->state,”sende”)==0) && (strcmp(prodeiktis->epomenos->state,”inter”)==0) && link[i][i+1]==1)
    {
    prodeiktis->epomenos->temp = 2;
    link[i+1][i+2]=1;
    link[i+1][i]=0;
    allagi=1;
    }
    if((strcmp(prodeiktis->state,”sende”)==0) && (strcmp(prodeiktis->epomenos->state,”recei”)==0) && (link[i][i+1]==1) && (link[i+1][i]==0))
    {
    prodeiktis->temp = 3;
    prodeiktis->epomenos->temp =1;
    allagi=1;
    }
    if((strcmp(prodeiktis->state,”sende”)==0) && (strcmp(prodeiktis->epomenos->state,”sende”)==0) && (link[i][i+1]==1) && (link[i+1][i]==1))
    {
    prodeiktis->epomenos->temp =2;
    link[i+1][i+2]=1;
    link[i+1][i]=0;
    allagi=1;
    }
    if((strcmp(prodeiktis->state,”inter”)==0) && (strcmp(prodeiktis->epomenos->state,”inter”)==0) && (link[i][i+1]==1) && (link[i+1][i]==1))
    {
    prodeiktis->temp =1;
    allagi=1;
    }
    proxorise(&prodeiktis);
    }

                //——————-Kikliki Lista -> Proteleutaios komvos——————//
    if (prodeiktis->temp == 1)
    {
    sprintf(prodeiktis->state,”sende”);
    }
    if (prodeiktis->temp == 2)
    {
    sprintf(prodeiktis->state,”recei”);
    }
    if (prodeiktis->temp == 3)
    {
    sprintf(prodeiktis->state,”inter”);
    }
    if((strcmp(prodeiktis->state,”sende”)==0) && (strcmp(prodeiktis->epomenos->state,”inter”)==0) && link[i][i+1]==1)
    {
    prodeiktis->epomenos->temp = 2;
    link[i+1][0]=1; //——-
    link[i+1][i]=0;
    allagi=1;
    }
    if((strcmp(prodeiktis->state,”sende”)==0) && (strcmp(prodeiktis->epomenos->state,”recei”)==0) && (link[i][i+1]==1) && (link[i+1][i]==0))
    {
    prodeiktis->temp = 3;
    prodeiktis->epomenos->temp =1;
    allagi=1;
    }
    if((strcmp(prodeiktis->state,”sende”)==0) && (strcmp(prodeiktis->epomenos->state,”sende”)==0) && (link[i][i+1]==1) && (link[i+1][i]==1))
    {
    prodeiktis->epomenos->temp =2;
    link[i+1][0]=1; //——
    link[i+1][i]=0;
    allagi=1;
    }
    if((strcmp(prodeiktis->state,”inter”)==0) && (strcmp(prodeiktis->epomenos->state,”inter”)==0) && (link[i][i+1]==1) && (link[i+1][i]==1))
    {
    prodeiktis->temp =1;
    allagi=1;
    }
    proxorise(&prodeiktis);

                    //——————-Kikliki Lista -> Teleutaios komvos——————//
    arxi = *riza;

                    if (prodeiktis->temp == 1)
    {
    sprintf(prodeiktis->state,”sende”);
    }
    if (prodeiktis->temp == 2)
    {
    sprintf(prodeiktis->state,”recei”);
    }
    if (prodeiktis->temp == 3)
    {
    sprintf(prodeiktis->state,”inter”);
    }
    if((strcmp(prodeiktis->state,”sende”)==0) && (strcmp(arxi->state,”inter”)==0) && link[i][0]==1)
    {
    arxi->temp = 2;
    link[0][1]=1;
    link[0][i]=0;
    allagi=1;
    }
    if((strcmp(prodeiktis->state,”sende”)==0) && (strcmp(arxi->state,”recei”)==0) && (link[i][0]==1) && (link[0][i]==0))
    {
    prodeiktis->temp = 3;
    arxi->temp =1;
    allagi=1;
    }
    if((strcmp(prodeiktis->state,”sende”)==0) && (strcmp(arxi->state,”sende”)==0) && (link[i][0]==1) && (link[0][i]==1))
    {
    arxi->temp =2;
    link[0][1]=1;
    link[0][i]=0;
    allagi=1;
    }
    if((strcmp(prodeiktis->state,”inter”)==0) && (strcmp(arxi->state,”inter”)==0) && (link[i][0]==1) && (link[0][i]==1))
    {
    prodeiktis->temp =1;
    allagi=1;
    }
    prodeiktis = *riza;

            }

            //////////////////APOTELESMATA////////////////////////////
    printf(“\n\n****************Apotelesmata*****************\n\n”);
    printf(“Katastasi Komvon Daktiliou\n”);
    printf(“————————–\n”);
    prodeiktis = *riza;
    for(i=0;i<megethos;i++)
    {
    printf(“Komvos %d : “,i);
    printf(“ID = %d “,node_id(prodeiktis));
    printf(“State = %s\n”,periexomeno(prodeiktis));
    proxorise(&prodeiktis);
    }

            /////////Tipose ta links//////////////
    printf(“Pinakas Zeukseon Succ kai Pred metaksi komvon\n”);
    printf(“———————————————\n”);
    for(i=0;i < megethos;i++)
    {
    for(j=0;j < megethos;j++)
    {
    printf(“%d “,link[i][j]);
    }
    printf(“\n”);
    }
    printf(“Kateuthinseis zeukseon metaksi komvon\n”);
    printf(“————————————-\n”);
    for(i=0;i < megethos;i++)
    {
    for(j=0;j < megethos;j++)
    {
    if(link[i][j] == 1)
    {
    printf(“%d->%d\n”,i,j);
    }
    }
    }
    //////////////////APOTELESMATA////////////////////////////
    }

    File List.c

    /*************************************************************************
    Αρχείο Υλoπoίησης    : list.c
    Σκοπός                : Υλοποίηση με δείκτες ΑΤΔ, κυκλικά Συνδεδεμένη Λίστα
    **************************************************************************/
    #include <stdio.h>
    #include <stdlib.h>

    typedef char   typos_stoixeiou;
    typedef struct typos_komvou *typos_deikti;
    typedef struct typos_komvou
    {
    typos_stoixeiou state[5];
    typos_deikti epomenos;
    int id;
    int tok;
    int temp;
    };
    typos_deikti lista;

    void dimiourgia(typos_deikti *lista);
    int keni(typos_deikti lista);
    void proxorise(typos_deikti *p);
    typos_stoixeiou *periexomeno(typos_deikti p);
    void diagrafi(typos_deikti *lista, typos_deikti prodeiktis);

    void eisagogi(typos_deikti *lista,typos_stoixeiou *stoixeio,int id,typos_deikti prodeiktis);
    void eisagogi_arxi(typos_deikti *lista,typos_stoixeiou *stoixeio,int id);
    void eisagogi_meta(typos_deikti prodeiktis,typos_stoixeiou *stoixeio,int id);

    int node_id(typos_deikti p);
    int send(int tok,typos_deikti p);

    void dimiourgia(typos_deikti *lista)
    {
    /*
    *    Πρo:         καμία
    *    Μέτά:         Δημιoυργία κενής συνδεδεμένης λίστα
    */
    *lista = NULL;
    }

    int keni(typos_deikti lista)
    {
    /*
    *    Πρo:         Δημιoυργία λίστας
    *    Μέτά:        επιστρέφει 1 αν η λίστα είναι κενή, διαφoρετικά 0
    */
    return ( lista == NULL );
    }

    void proxorise(typos_deikti *p)
    {
    /*
    *    Πρo:         Ο δείκτης p δείχνει ένα κόμβο στην λίστα
    *    Μέτά:        Ο δείκτης p δείχνει στον επόμενο κόμβο στην λίστα
    */
    *p = (*p)->epomenos;
    }

    typos_stoixeiou *periexomeno(typos_deikti p)
    {
    /*
    *    Πρo:         Ο δείκτης p δείχνει ένα κόμβο στην λίστα
    *    Μέτά:        επιστρέφει τα δεδομένα στον κόμβο που δείχνει ο p
    */
    return (p->state);
    }

    int node_id(typos_deikti p)
    {
    /*
    *    Πρo:         Ο δείκτης p δείχνει ένα κόμβο στην λίστα
    *    Μέτά:        επιστρέφει τα δεδομένα στον κόμβο που δείχνει ο p
    */
    return (p->id);
    }

    int send(int tok,typos_deikti p)
    {
    /*
    *    Πρo:         Ο δείκτης p δείχνει ένα κόμβο στην λίστα
    *    Μέτά:        επιστρέφει τα δεδομένα στον κόμβο που δείχνει ο p
    */
    if(p->id == tok)
    {
    sprintf(p->state,”leade”);
    return 1;
    }
    p->temp = tok;

        return 0;

    }

    void eisagogi_meta(typos_deikti prodeiktis,typos_stoixeiou *stoixeio,int id)
    {
    /*
    *    Πρo:         Δημιoυργία λίστα
    *    Μέτά:         Ο κόμβος με τα δεδομένα stoixeio έχει εισαχθεί
    *                μετά τον κόμβο που δείχνει ο prodeiktis
    */    int i;
    typedef struct
    {
    typos_stoixeiou state[5];
    typos_deikti epomenos;
    int id;
    int tok;
    int temp;
    }typos_komvou;
    typos_deikti prosorinos; /*Δείχνει τον νέο κόμβο που πρόκειτε να εισαχθεί*/

        prosorinos = (typos_deikti)malloc(sizeof(typos_komvou));
    if ( prosorinos == NULL )
    {
    fprintf(stderr,”Η μνήμη είναι γεμάτη\n”);
    exit(-1);
    }
    for(i=0;i<5;i++)
    prosorinos->state[i] = stoixeio[i];
    prosorinos->state[i] = ‘\0’;
    prosorinos->id = id;
    prosorinos->tok = id;
    prosorinos->temp = 0;
    prosorinos->epomenos = prodeiktis->epomenos;
    prodeiktis->epomenos = prosorinos;
    }

    void eisagogi_arxi(typos_deikti *lista,typos_stoixeiou *stoixeio,int id)
    {
    /*
    *    Πρo:         O δείκτης p δείχνει ττην αρχή της λίστας
    *    Μέτά:         Ο κόμβος με τα δεδομένα stoixeio έχει εισαχθεί
    *                πριν τον κόμβο που εδείχνει ο p, ο p δείχνει πλέον την νέα αρχή της λίστας
    */
    int i;
    typedef struct
    {
    typos_stoixeiou state[5];
    typos_deikti epomenos;
    int id;
    int tok;
    int temp;
    }typos_komvou;
    typos_deikti prosorinos; /*Δείχνει τον νέο κόμβο που πρόκειτε να εισαχθεί*/

        prosorinos = (typos_deikti)malloc(sizeof(typos_komvou));
    if ( prosorinos == NULL )
    {
    fprintf(stderr,”Η μνήμη είναι γεμάτη\n”);
    exit(-1);
    }
    for(i=0;i<5;i++)
    prosorinos->state[i] = stoixeio[i];
    prosorinos->state[i] = ‘\0’;
    prosorinos->id = id;
    prosorinos->tok = id;
    prosorinos->temp = 0;
    prosorinos->epomenos = *lista;
    *lista = prosorinos;
    }

    void eisagogi(typos_deikti *lista,typos_stoixeiou *stoixeio,int id,typos_deikti prodeiktis)
    {
    /*
    *    Πρo:         Ο prodeiktis δείχνει ένα κόμβο στην λίστα ή είναι NULL
    *    Μέτά:         Αν ο prodeiktis είναι NULL τοτε ο κόμβος με τα δεδομένα
    *                stoixeio έχει εισαχθεί στην αρχή της λίστας αλλιώς ο εισάγεται μετά
    *                τον κόμβο που δείχνει ο prodeiktis
    */
    if (keni(prodeiktis)) /*εισαγωγή στην αρχή της λίστας*/
    eisagogi_arxi(lista,stoixeio,id);
    else
    eisagogi_meta(prodeiktis,stoixeio,id);
    }