采用邻接矩阵的形式创建无向图并深度遍历

#include<stdio.h>
#include<stdlib.h>
#define Status
#define OK 1
#define MaxInt 32767
#define MVNum 100
typedef char VerTexType;
typedef int ArcType;
typedef struct
{
    VerTexType vexs[MVNum];
    ArcType arcs[MVNum][MVNum];
    int vexnum,arcnum;
 } AMGraph;
 int LocateVex(AMGraph *G, VerTexType vex)
 {
    for(int i=0;i<G->vexnum;i++)
    {
        if(G->vexs[i]==vex)
        {
            return i;
        }
    }
}
 Status CreateUDN(AMGraph *G)
 {
     printf("请输入总顶点数\n");
     scanf("%d",&G->vexnum);
     printf("请输入总边数\n");
    scanf("%d",&G->arcnum);
    int i=0;
    getchar();
    printf("请输入顶点信息\n"); 
    for(i=0;i<G->vexnum;++i)
    {
        scanf("%c",&G->vexs[i]);
        getchar();
      }  
      int j=0;
      int k=0;
    for(i=0;i<G->vexnum;++i)
    {
        for(j=0;j<G->vexnum;++j)
        {
            G->arcs[i][j]=0;
        }
    }
    for(k=0;k<G->arcnum;++k)
    {
        printf("请输入第%d条边的信息\n",(k+1));
        printf("请输入第一个顶点:\n");
        VerTexType v1;
        VerTexType v2;
        scanf("%c",&v1);
        getchar();
        printf("请输入第二个顶点:\n");
        scanf("%c",&v2);
        getchar();
        int i;
        int j;
         i=LocateVex(G,v1);
         j=LocateVex(G,v2);
        G->arcs[i][j]=1;
        G->arcs[j][i]=G->arcs[i][j];
    }
    return OK;
 }
 
 bool visited[MVNum];
 int FirstAdjVex(AMGraph G, int v)
{
    for (int i = 0; i < G.vexnum; i++)
    {
        if (G.arcs[v][i] != 0)
        {
            return i;
        }
    }
    return -1;
}
 
int NextAdjVex(AMGraph G, int v, int w)
{
    for (int i = w + 1; i < G.vexnum; i++)
    {
        if (G.arcs[v][i] != 0)
        {
            return i;
        }
    }
    return -1;
}

 void DFS(AMGraph G,int v)
 {
     printf("%c",G.vexs[v]);
     visited[v]=true;
     for(int w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
     {
         if(!visited[w])
         DFS(G,w);
     }
 }
 int main()
 {
     AMGraph G;
     CreateUDN(&G);
     int v=0;
     DFS(G,v);
 }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值