c语音试编写程序,以图的邻接表表示为存储结构,从键盘输入一个无向图,包括连通和不连通两种情况,判断该图是否连通,如果不连通输出所有的连通分量 (1)以图的邻接表表示为存储结构建立无向图。 (2)编写无向图的深度搜索函数。 (3)对图进行编历时,对搜索函数的调用次数进行统计n,若n=1,则该无向图是连通的,否则不连通,n为连通分量的个数。 (4)在主函数中调用菜单函数调试程序。
时间: 2023-09-19 10:11:37 浏览: 75
以下是C语言代码实现:
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100
typedef struct ArcNode
{
int adjvex; // 邻接点的位置
struct ArcNode *nextarc; // 指向下一个邻接点的指针
}ArcNode;
typedef struct VertexNode
{
int data; // 顶点信息
struct ArcNode *firstarc; // 指向第一个邻接点的指针
}VertexNode, AdjList[MAX_VERTEX_NUM];
typedef struct
{
AdjList vertices; // 邻接表
int vexnum, arcnum; // 顶点数和边数
}Graph;
int visited[MAX_VERTEX_NUM]; // 访问标记数组
// 无向图的深度优先搜索
void DFS(Graph G, int v, int *count)
{
visited[v] = 1;
ArcNode *p = G.vertices[v].firstarc;
while (p)
{
if (!visited[p->adjvex])
{
DFS(G, p->adjvex, count);
}
p = p->nextarc;
}
(*count)++;
}
// 判断无向图是否连通
int IsConnected(Graph G)
{
int count = 0;
for (int i = 0; i < G.vexnum; i++)
{
visited[i] = 0;
}
DFS(G, 0, &count);
if (count == G.vexnum)
{
return 1; // 连通
}
else
{
return count; // 不连通,返回连通分量的个数
}
}
// 建立无向图的邻接表存储结构
void CreateGraph(Graph *G)
{
printf("请输入顶点数和边数:");
scanf("%d%d", &(G->vexnum), &(G->arcnum));
getchar(); // 吃掉换行符
printf("请输入各个顶点的信息:\n");
for (int i = 0; i < G->vexnum; i++)
{
printf("第%d个顶点:", i + 1);
scanf("%d", &(G->vertices[i].data));
G->vertices[i].firstarc = NULL;
}
printf("请输入边的信息:\n");
for (int k = 0; k < G->arcnum; k++)
{
int i, j;
printf("第%d条边:", k + 1);
scanf("%d%d", &i, &j);
ArcNode *p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = j - 1;
p->nextarc = G->vertices[i - 1].firstarc;
G->vertices[i - 1].firstarc = p;
p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = i - 1;
p->nextarc = G->vertices[j - 1].firstarc;
G->vertices[j - 1].firstarc = p;
}
}
// 输出无向图的邻接表存储结构
void PrintGraph(Graph G)
{
printf("无向图的邻接表存储结构如下:\n");
for (int i = 0; i < G.vexnum; i++)
{
printf("%d: ", G.vertices[i].data);
ArcNode *p = G.vertices[i].firstarc;
while (p)
{
printf("%d ", G.vertices[p->adjvex].data);
p = p->nextarc;
}
printf("\n");
}
}
// 菜单函数
void menu()
{
printf("**********操作菜单**********\n");
printf("1. 建立无向图\n");
printf("2. 输出无向图的邻接表存储结构\n");
printf("3. 判断无向图是否连通\n");
printf("0. 退出\n");
printf("*****************************\n");
}
int main()
{
Graph G;
int choice;
do
{
menu();
printf("请选择操作(0-3):");
scanf("%d", &choice);
switch (choice)
{
case 1:
CreateGraph(&G);
break;
case 2:
PrintGraph(G);
break;
case 3:
int count = IsConnected(G);
if (count == 1)
{
printf("该无向图是连通的!\n");
}
else
{
printf("该无向图不连通,有%d个连通分量。\n", count);
}
break;
case 0:
break;
default:
printf("输入有误,请重新输入!\n");
break;
}
} while (choice != 0);
return 0;
}
```
注意事项:
1. 本代码实现中,图中每个顶点的信息采用整数表示,可以根据需要修改。
2. 本代码实现中,无向图的深度优先搜索使用递归方式实现,可以使用非递归方式实现,但本质相同。
阅读全文