深度优先遍历有向图c语言程序

#include<stdlib.h>
#include<stdio.h>
#define MAX_VERTEX_NUM 20
typedef char VertexType;
typedef int InfoType;


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


typedef struct VNode
{
    VertexType data;
    ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];


typedef struct{
 AdjList vertices;
 int vexnum,arcnum;
 int kind;
 }ALGraph;
 //返回顶点v在图顶点向量中的位置
 int LocateVex(ALGraph G,char v)
 {    int i;
     for(int i=0;v!=G.vertices[i].data&&i<G.vexnum;++i);
     if(i>=G.vexnum)
     return -1;
     return i;
 }
 //建立有向图连接链表
 void creatDG(ALGraph &G)
 {
     int i,j;
     char v1,v2;
     ArcNode *s;
     printf("输入有向图的顶点数:");
     scanf("%d",&G.vexnum);
     printf("输入有向图的边数:");
     scanf("%d",&G.arcnum);
     for(i=0;i<G.vexnum;i++)
     {
         printf("输入第%d的顶点的信息:",i+1);
         scanf("%s",&G.vertices[i].data);
         G.vertices[i].firstarc=NULL;
     }
     for(int i1=0;i1<G.arcnum;i1++)//该弧所指的顶点的位置
     {
         printf("输入第%d条边的弧尾顶点:",i1+1);
         scanf("%s",&v1);
         printf("输入第%d条边的弧头顶点:",i1+1);
         scanf("%s",&v2);
         i=LocateVex(G,v1);
         j=LocateVex(G,v2);
         s=(ArcNode *)malloc(sizeof(ArcNode));
         s->adjvex=j;//弧所指的顶点的位置为j
         s->nextarc=G.vertices[i].firstarc;
         G.vertices[i].firstarc=s;
     }
    }
    //从第v个顶点出发,递归的深度优先遍历有向图 G
    void DFS(ALGraph G,int v,int *visited)
    {
        int w;
        ArcNode *s;
        visited[v]=1;
        printf("%c->",G.vertices[v].data);
        s=(ArcNode *)malloc(sizeof(ArcNode));
        s=G.vertices[v].firstarc;
        while(s!=NULL)
        {
            w=s->adjvex;
            if(visited[w]==0)
            DFS(G,w,visited);
            s=s->nextarc;
        }
    }
    //对图做深度优先遍历
    void DFSTraverse(ALGraph G)
    {
        int v;
        int visited[MAX_VERTEX_NUM];
        for(v=0;v<G.vexnum;++v)
        visited[v]=0;//初始化
        for(v=0;v<G.vexnum;++v)
        if(visited[v]==0)
        DFS(G,v,visited);//对未访问的顶点调用DFS()
        printf("完成\n");


    }
     //输出邻接表
     void printAdjList(ALGraph G)
     {
      int i;
      ArcNode *p;
      printf("%4s%6s%12s\n","编号","顶点","相邻边编号");
      for(i=0;i<G.vexnum;i++)
      {
          printf("%4d%5c",i,G.vertices[i].data);
          for(p=G.vertices[i].firstarc;p;p=p->nextarc)
          printf("%3d",p->adjvex);//弧所指的顶点的位置
          printf("\n");


      }
     }
     int main(){
     ALGraph G;
     creatDG(G);//调用有向图创建函数CreateDG()
     printf("有向图的邻接表为;\n");
     printAdjList(G);
     printf("深度优先遍历该有向图:\n");
     DFSTraverse(G);//调用图的深度优先函数DFSTraverse()
     }

猜你喜欢

转载自blog.csdn.net/qq_38452951/article/details/80499622