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