邻接表的创建及应用

#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("--------------图的创建开始------------\n");

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

     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("输入边值:\n");

     //创建无向图
     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("--------------图的创建结束------------\n");
 }

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

     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(" ^ ]\n");
     }

     printf("--------------图的输出结束------------\n\n");
 }
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\n",count);//输出每个连通图中的顶点下标
             num++;
         }

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

}

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

posted @ 2019-12-05 16:43  wwww2  阅读(371)  评论(0编辑  收藏  举报