图的基本操作

#include "stdlib.h"
#include "stdio.h"
#define MAXN 20
#define INF 65535
#define TRUE 1
#define FALSE 0
typedef struct MGraph
{
    int n,e;
    int a[MAXN][MAXN];
    int adj[MAXN];
}MGraph;

typedef struct ArcNode
{
    int adjvex;
    struct ArcNode *nextarc;
}ArcNode;

typedef struct VNode
{
    int data;
    ArcNode *firstarc;
}VNode;

typedef struct AGraph
{
    int n,e;
    VNode adjlist[MAXN];
}AGraph;

void CreateGraph(MGraph *g,int a[][MAXN],int n,int e)
{
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
           g->a[i][j]=a[i][j];
    g->n=n;
    g->e=e;
}

void DispGraph(MGraph g)
{
    int i,j;
    for (i=0;i<g.n;i++)
    {
        for (j=0;j<g.n;j++)
            if (g.a[i][j]<INF)
                printf("%4d",g.a[i][j]);
            else
                printf("%4s","∞");
        printf("\n");
    }
}
void MtoA(MGraph g, AGraph *ag)
{
    int i,j;
    ArcNode *p;
    ag->n=g.n;ag->e=g.e;
    for(i=0;i<g.n;i++)
    {
        ag->adjlist[i].firstarc=NULL;
    }
    for(i=0;i<g.n;i++)
    {
        for(j=0;j<g.n;j++)
        {
            if(g.a[i][j]!=0&&g.a[i][j]!=INF)
            {
               p=(ArcNode*)malloc(sizeof(ArcNode));
               p->adjvex=j;p->nextarc=NULL;
               p->nextarc=ag->adjlist[i].firstarc;
               ag->adjlist[i].firstarc =p;
            }
        }
    }
}
void showAGraph(AGraph ag)
{
    int i;
    ArcNode *p;
    for(i=0;i<ag.n;i++)
    {
        p=ag.adjlist[i].firstarc;
        printf(" %d   ",i);
        while(p!=NULL)
        {
            printf("%d ",p->adjvex);
            p=p->nextarc;
         }
        printf("\n");
    }
}
int finished[MAXN];
void mdfs(MGraph g,int v)
{
    finished[v]=TRUE;
    printf("%d  ",v);
    for(int i=0;i<g.n;i++)
    {
        if(finished[i]!=TRUE&&g.a[v][i]!=0&&g.a[v][i]!=INF)
            mdfs(g,i);
    }

}
void adfs(AGraph ag, int v)
{
    ArcNode *p;int k;
    finished[v]=TRUE;
    printf("%d  ",v);
    p=ag.adjlist[v].firstarc;

    while(p!=NULL)
    {    k=p->adjvex;
        if(finished[k]!=TRUE)
            adfs(ag,k);
        p=p->nextarc;
    }
}
void mbfs(MGraph g, int v)
{
    int qu[100];int f=0;int r=0;
    int k;
    finished[v]=TRUE;
    printf("  %d  ",v);
    qu[r++]=v;
    while(f!=r)
    {
        k=qu[f++];
        for(int i=0;i<g.n;i++)
        {
            if(finished[i]!=TRUE&&g.a[v][i]!=0&&g.a[v][i]!=INF)
            {
                finished[i]=TRUE; printf("  %d  ",i);
                qu[r++]=i;
            }
        }

    }

}

void abfs(AGraph ag, int v)
{
    int qu[100];int f=0;int r=0;
    ArcNode *p;int k;
    finished[v]=TRUE;
    printf("  %d  ",v);
    qu[r++]=v;
    while(f!=r)
    {
        k=qu[f++];
        p=ag.adjlist[k].firstarc;
        while(p!=NULL)
        {
            if(finished[p->adjvex]!=TRUE)
            {
                finished[p->adjvex]=TRUE; printf("  %d  ",p->adjvex);
                qu[r++]=p->adjvex;
            }
            p=p->nextarc;
        }

    }

}
void topo(AGraph ag)
{
    int indgree[MAXN];
    int mystack[MAXN];
    int top=0;
    int k;
    ArcNode *p;
    for(int i=0;i<ag.n;i++)
        indgree[i]=0;

     for(int i=0;i<ag.n;i++)
     {
         p=ag.adjlist[i].firstarc;
         while(p!=NULL)
         {
             indgree[p->adjvex]++;
               p=p->nextarc;
         }

     }

    for(int i=0;i<ag.n;i++)
        if(indgree[i]==0)
            mystack[top++]=i;
    if(top==0)  {printf("error\n");return;}
    while(top!=0)
    {k=mystack[--top];
     printf(" %d  ",k);
     p=ag.adjlist[k].firstarc;
     while(p!=NULL)
     {
        indgree[p->adjvex]--;
        if(indgree[p->adjvex]==0)
            mystack[top++]=p->adjvex;
        p=p->nextarc;
     }

    }


}
int main()
{
    MGraph g;
    AGraph ag;
    int n=5,e=7,i;
    int A[MAXN][MAXN]={{0,1,2,6,INF},{INF,0,INF,4,5},{INF,INF,0,INF,3},{INF,INF,INF,0,INF},{INF,INF,INF,7,0}};
    CreateGraph(&g,A,n,e);
    printf("matrix storage:\n");
    DispGraph(g);
    MtoA(g,&ag);
        printf("adjacency storage:\n");
    showAGraph(ag);
        printf("dfs:\n");
    for(int i=0;i<n;i++)
        finished[i]=FALSE;
    for(int i=0;i<n;i++)
    {
        if(finished[i]!=TRUE)
            mdfs(g,i);
    }
        printf("dfs:\n");
    for(int i=0;i<n;i++)
        finished[i]=FALSE;
    for(int i=0;i<n;i++)
    {
        if(finished[i]!=TRUE)
            adfs(ag,i);
    }
        printf("\n bfs :\n");
        for(int i=0;i<n;i++)
        finished[i]=FALSE;
    for(int i=0;i<n;i++)
    {
        if(finished[i]!=TRUE)
            mbfs(g,i);
    }
    printf("\n bfs :\n");
           for(int i=0;i<n;i++)
        finished[i]=FALSE;
    for(int i=0;i<n;i++)
    {
        if(finished[i]!=TRUE)
            abfs(ag,i);
    }
        printf("\n topo :\n");

        topo(ag);
    printf("\nfinished\n");
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值