#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);
}
邻接表的创建及连通子图个数求解