题目:
采用邻接表表示法,构造无向图G,并从任意一个顶点出发,递归地深度优先遍历该图G,并求该图的连通分量个数
图的邻接表存储表示:
#include<stdio.h>
#include<stdlib.h>
#define MAX_VERTEX_NUM 20 //最大顶点个数
typedef int VertexType; //顶点向量数据类型
typedef enum { DG, DN, UDG, UDN }GraphKind; //{有向图,有向网,无向图,无向网}
//邻接点结点结构
typedef struct ArcNode {
int adjvex; //该弧所指向的顶点的位置
int weight; //该弧的权值
struct ArcNode* nextarc; //指向下一条弧的指针
}ArcNode;
//顶点结点结构
typedef struct VNode {
VertexType data; //顶点信息
ArcNode* firstarc; //指向第一条依附该顶点的弧的指针
}VNode, AdjList[MAX_VERTEX_NUM];
//邻接表
typedef struct {
AdjList vertices; //邻接表
int vexnum, arcnum; //图的顶点数和弧数
GraphKind kind; //图的种类
}ALGraph;
图的创建和打印:
//有向图
void CreateDG(ALGraph& G) {
int i, j;
printf("请输入图的顶点数和弧数:\n");
scanf("%d%d", &G.vexnum, &G.arcnum);
printf("请输入图的顶点信息:");
for (int i = 0; i < G.vexnum; i++) {
scanf("%d", &G.vertices[i].data);
G.vertices[i].firstarc = NULL;
}
for (int k = 0; k < G.arcnum; k++) {
printf("请输入一条边依附的顶点:\n");
scanf("%d%d", &i, &j);
ArcNode* p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = j;
p->nextarc = G.vertices[i].firstarc;
G.vertices[i].firstarc = p;
}
}
//有向网
void CreateDN(ALGraph& G) {
int i, j, w;
printf("请输入图的顶点数和弧数:\n");
scanf("%d%d", &G.vexnum, &G.arcnum);
printf("请输入图的顶点信息:");
for (int i = 0; i < G.vexnum; i++) {
scanf("%d", &G.vertices[i].data);
G.vertices[i].firstarc = NULL;
}
for (int k = 0; k < G.arcnum; k++) {
printf("请输入一条边依附的顶点:\n");
scanf("%d%d", &i, &j);
printf("请输入边所对应的权值:\n");
scanf("%d", &w);
ArcNode* p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = j;
p->weight = w;
p->nextarc = G.vertices[i].firstarc;
G.vertices[i].firstarc = p;
}
}
//无向图
void CreateUDG(ALGraph& G) {
int i, j;
printf("请输入图的顶点数和弧数:\n");
scanf("%d%d", &G.vexnum, &G.arcnum);
printf("请输入图的顶点信息:");
for (int i = 0; i < G.vexnum; i++) {
scanf("%d", &G.vertices[i].data);
G.vertices[i].firstarc = NULL;
}
for (int k = 0; k < G.arcnum; k++) {
printf("请输入一条边依附的顶点:\n");
scanf("%d%d", &i, &j);
ArcNode* p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = j;
p->nextarc = G.vertices[i].firstarc;
G.vertices[i].firstarc = p;
ArcNode* q = (ArcNode*)malloc(sizeof(ArcNode));
q->adjvex = i;
q->nextarc = G.vertices[j].firstarc;
G.vertices[j].firstarc = q;
}
}
//无向网
void CreateUDN(ALGraph& G) {
int i, j, w;
printf("请输入图的顶点数和弧数:\n");
scanf("%d%d", &G.vexnum, &G.arcnum);
printf("请输入图的顶点信息:");
for (int i = 0; i < G.vexnum; i++) {
scanf("%d", &G.vertices[i].data);
G.vertices[i].firstarc = NULL;
}
for (int k = 0; k < G.arcnum; k++) {
printf("请输入一条边依附的顶点:\n");
scanf("%d%d", &i, &j);
printf("请输入边所对应的权值:\n");
scanf("%d", &w);
ArcNode* p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = j;
p->weight = w;
p->nextarc = G.vertices[i].firstarc;
G.vertices[i].firstarc = p;
ArcNode* q = (ArcNode*)malloc(sizeof(ArcNode));
q->adjvex = i;
q->nextarc = G.vertices[j].firstarc;
G.vertices[j].firstarc = q;
}
}
void CreateALGraph(ALGraph& G) {
printf("请输入图的类型:\n");
scanf("%d", &G.kind);
switch (G.kind) {
case DG:return CreateDG(G);//有向图
case DN:return CreateDN(G);//有向网
case UDG:return CreateUDG(G);//无向图
case UDN:return CreateUDN(G);//无向网
}
}
//打印图(打印网的话多加一个权值的打印即可)
void PrintALGraph(ALGraph G) {
for (int i = 0; i < G.vexnum; i++) {
printf("%d\t", G.vertices[i].data);
ArcNode* p = G.vertices[i].firstarc;
while (p) {
printf("%d\t",p->adjvex);
p = p->nextarc;
}
printf("\n");
}
}
无向图的深度优先搜索:(默认开始顶点)
int visited[MAX_VERTEX_NUM], count = 0;
void DFS(ALGraph G, int i) {
visited[i] = 1;
printf("%d ", G.vertices[i].data);
ArcNode* p = G.vertices[i].firstarc;
while (p) {
if (!visited[p->adjvex])
DFS(G, p->adjvex);
p = p->nextarc;
}
}
void DFSTraverse(ALGraph G) {
for (int i = 0; i < G.vexnum; i++) {
visited[i] = 0;
}
printf("深度优先搜索遍历后为:\n");
for (int i = 0; i < G.vexnum; i++) {
if (!visited[i]) {
count++;
DFS(G, i);
}
}
printf("\n图的连通分量个数为:%d\n", count);
}
运行结果如下:
无向图的深度优先搜索:(自定义开始顶点)
int visited[MAX_VERTEX_NUM], count = 0;
void DFS(ALGraph G, int i) {
visited[i] = 1;
printf("%d ", G.vertices[i].data);
ArcNode* p = G.vertices[i].firstarc;
while (p) {
if (!visited[p->adjvex])
DFS(G, p->adjvex);
p = p->nextarc;
}
}
void DFSTraverse(ALGraph G) {
for (int i = 0; i < G.vexnum; i++) {
visited[i] = 0;
}
printf("请输入开始遍历的顶点序号:\n");
int n, cnt = 0;
scanf("%d", &n);
printf("深度优先搜索遍历后为:\n");
while (cnt < G.vexnum) {
if (!visited[n]) {
count++;
DFS(G, n);
}
n++;
if (n == G.vexnum)
n = 0;
cnt++;
}
printf("\n图的连通分量个数为:%d\n", count);
}
运行结果如下:
无向图的广度优先搜索:(默认开始顶点)
void BFSTraverse(ALGraph G) {
int Q[MAX_VERTEX_NUM], front = 0, rear = 0;
for (int i = 0; i < G.vexnum; i++) {
visited[i] = 0;
}
printf("广度优先搜索遍历后为:\n");
Q[rear] = 0;
visited[rear] = 1;
rear = (rear + 1) % MAX_VERTEX_NUM;
while (front != rear) {
int i = Q[front];
printf("%d ", G.vertices[i].data);
front = (front + 1) % MAX_VERTEX_NUM;
ArcNode* p = G.vertices[i].firstarc;
while (p) {
if (!visited[p->adjvex]) {
visited[p->adjvex] = 1;
Q[rear] = p->adjvex;
rear = (rear + 1) % MAX_VERTEX_NUM;
}
p = p->nextarc;
}
}
}
运行结果如下:
无向图的广度优先搜索:(自定义开始顶点)
void BFSTraverse(ALGraph G) {
int Q[MAX_VERTEX_NUM], front = 0, rear = 0;
for (int i = 0; i < G.vexnum; i++) {
visited[i] = 0;
}
printf("请输入开始遍历的顶点序号:\n");
int n;
scanf("%d", &n);
printf("广度优先搜索遍历后为:\n");
Q[rear] = n;
visited[n] = 1;
rear = (rear + 1) % MAX_VERTEX_NUM;
while (front != rear) {
int i = Q[front];
printf("%d ", G.vertices[i].data);
front = (front + 1) % MAX_VERTEX_NUM;
ArcNode* p = G.vertices[i].firstarc;
while (p) {
if (!visited[p->adjvex]) {
visited[p->adjvex] = 1;
Q[rear] = p->adjvex;
rear = (rear + 1) % MAX_VERTEX_NUM;
}
p = p->nextarc;
}
}
}
运行结果如下:
本次记录就到这~~~有问题拜托请指出~~~