邻接表的创建及应用

#include<stdio.h>
#include<stdlib.h>
#define MAX 20
typedef char vextype;
//
typedef  struct  node{      //定义边结点的类型
   int adjver;   //边的邻接点的数据(顶点的序号)
   struct  node  *next; //指向本边下一邻接点的指针
}edgeNode;

//顶点
typedef  struct {   //定义顶点的类型
   vextype  vertex;     //顶点的数据
   edgeNode  *link;    //指向本边邻接表
}verNode;

//
typedef  struct {
   verNode adjlist[MAX];
   int n,e;  //n-顶点数,e-边数
}link_graph;

 //创建无向图
 void CreateGraph(link_graph &g)
 {
     printf("--------------图的创建开始------------
");

     printf("输入顶点的个数及边的个数:
");

     scanf("%d%d",&g.n,&g.e);

     for(int i=0;i<g.n;i++)
     {
         g.adjlist[i].vertex = (char)(i+65);//顶点赋值
         g.adjlist[i].link = NULL;         //初始化link
     }

     printf("输入边值:
");

     //创建无向图
     for(int i=0;i<g.n;i++)
     {
         int n,m;
         scanf("%d%d",&n,&m);

         edgeNode * p = (edgeNode*)malloc(sizeof(edgeNode));
         p->adjver = m;
         p->next = g.adjlist[n].link;
         g.adjlist[n].link = p;

         p = (edgeNode*)malloc(sizeof(edgeNode));
         p->adjver = n;
         p->next = g.adjlist[m].link;
         g.adjlist[m].link = p;


     }
     printf("--------------图的创建结束------------
");
 }

 void PrintGraph(link_graph g)
 {
     printf("--------------图的输出开始------------
");

     for(int i=0;i<g.e;i++)
     {
        printf("%2d[%2c]-->[",i,g.adjlist[i].vertex);
        edgeNode * p = g.adjlist[i].link;
        while(p)
        {
             int j;
             printf("%2d,",p->adjver);
             p=p->next;
        }
        printf(" ^ ]
");
     }

     printf("--------------图的输出结束------------

");
 }
int count;
int visited[MAX];
void DFS(link_graph g,int v)
{
    count++;
    visited[v]=1;
    printf("%d ",v);
    edgeNode * p = g.adjlist[v].link;

    while(p)
    {
        int j = p->adjver;
        if(!visited[j])
        {
            DFS(g,j);

        }
        p = p->next;
    }
}

//深度优先遍历
void DFS_AL(link_graph g)
{
    int num=0;
     for(int i=0;i<g.n;i++)
     {
         visited[i]=0;
     }

     for(int i=0;i<g.n;i++)
     {
         count = 0;
         if(!visited[i])
         {
             DFS(g,i);
             printf("-->%d
",count);//输出每个连通图中的顶点下标
             num++;
         }

     }
     printf("连通图的个数为:%d
",num);
}
int main()
{
    link_graph G;
    //创建图
    CreateGraph(G);
    //打印图
    PrintGraph(G);
    //深度优先遍历
    DFS_AL(G);

}

邻接表的创建及连通子图个数求解

原文地址:https://www.cnblogs.com/wwww2/p/11990297.html