Wednesday, December 8, 2010

Implementing Graph Traversal (Breath First and Depth First)

Program Coding


// Include necessary headers

int main()


{



int ichoice,i,no=0,j;

int **graph=NULL;

char *symbl=NULL,gt,c,src,dest;

int getindex(char *,char ,int );


do{

    printf("\n\n\tGraph\n");

    printf("\n\t 1 to Create Graph \n");

    printf("\n\t 2 to Depth First Search \n");

    printf("\n\t 3 to Breath First Search\n");

    printf("\n\t 4 to Exit the program \n");

    printf("\n Your Choice -> ");



    scanf("%d",&ichoice);



    switch(ichoice) {

        case 1:
            if(graph!=NULL) {
                for(i=0;i<no;i++) 
                    free(graph[i]);
                free(graph);
                free(symbl);
            }

            printf("\n\tHow many nodes -> ");
            scanf("%d",&no);

            graph = malloc(no*sizeof(int *));
            symbl = malloc(no*sizeof(char));

            for(i=0;i<no;i++)
                graph[i] = (int *)malloc(no*sizeof(int));

            printf("\n\nGraph Type Directed or undirected -> ");
            getchar();

            gt = getchar();

            printf("\n\tEnter Nodes Avoid Repetition\n\t");

            for(i=0;i<no;i++) {
                scanf(" %c",&c);
                symbl[i] = c;
            }

            printf("\n\nEnter Edge pair\n");

            while(1) {
                scanf(" %c %c",&src,&dest);

                i=getindex(symbl,src,no);
                j=getindex(symbl,dest,no);

                if(i==-1||j==-1) break;

                if(gt =='d' || gt== 'D')
                    graph[i][j]=1;
                else
                    graph[i][j]=graph[j][i]=1;
            }

            printf("\n\nEdges created\n\n");
            break;
        case 2:
            dfs(graph,symbl,no);
            break;
        case 3:
            bfs(graph,symbl,no);
            break;
        case 4:
            exit(0);
    }
}while(1);

return 0;

}

int getindex(char *sy,char c,int n) { 
 
    int i;

    for(i=0;i<n;i++){
        if(sy[i]==c) 
            return i; 
    }
    return -1;
}

bfs(int **graph,char *symb,int n) {

    int x=0,*visited,i,que[20];
    int front=-1,rear=-1;
    char cc;

    visited = (int *) malloc(sizeof(int) * n);
    //Get Where to begin

    printf("\n\nWhere to Begin Traverse\n");
    getchar();

    cc = getchar();

    x=getindex(symb,cc,n);

    if(x==-1) {
        printf("\n\n\tInvalid Node....");
        return;
    }
 
    for(i=0;i<n;i++) 
        visited[i]=0;

    printf("\n\nBreath First Traversal\n");
    printf("%c ",symb[x]);

    visited[x]=1;

    rear++; 
    front++;
    que[rear]=x;

    while( front <= rear ) {
        x = que[front];
        front ++;
  
        for(i=0;i<n;i++) {
            if( (graph[x][i] == 1) && (visited[i] == 0) ) {
                printf("%c ",symb[i]);
                visited[i]=1;
                rear++;
                que[rear]=i;
            }
        }

    }     
}



dfs(int **graph,char *symb,int n) {

    int i,top=-1,stack[20],pop_v,j,t,*visited;
    int x=0;
    char cc;

    visited = (int *) malloc(sizeof(int ) * n); 
 
    for(i=0;i<n;i++)
        visited[i] = 0;
 
    printf("\n\nWhere to Begin Traverse\n");
    getchar();
    cc = getchar();
    x = getindex(symb,cc,n);

    if(x==-1) {
        printf("\n\tInvalid Node...");
        return ;
    }
    top++;
    stack[top] = x;
    printf("\n\nDepth First Traversal\n");

    while( top >= 0) {
        pop_v = stack[top];
        top--;
        if( visited[pop_v] == 0) {
            printf("%c ",symb[pop_v]);
            visited[pop_v] = 1;
        }
        else continue;
 
        for(i=n-1;i>=0;i--) {
            if( (graph[pop_v][i] == 1) && (visited[i] == 0) ) {
                top++;
                stack[top]=i;
            }
        } 
    }
}



The author is not liable for any discrepancies......