用c语言完成以下操作:构建图,并完成图的各种操作,比如深度遍历和广度遍历等
时间: 2023-12-10 09:41:52 浏览: 87
用C语言实现图的基本操作
5星 · 资源好评率100%
首先,我们需要定义一个图结构,包含图的顶点和边:
```c
#define MAX_VERTEX_NUM 100 //最大顶点数
//边结构体
typedef struct ArcNode{
int adjvex; //邻接点在顶点数组中的下标
struct ArcNode *nextarc; //指向下一个邻接点的指针
//int weight; //边的权值
}ArcNode;
//顶点结构体
typedef struct{
int data; //顶点的数据
ArcNode *firstarc; //指向第一个邻接点的指针
}VNode;
//图结构体
typedef struct{
VNode vertex[MAX_VERTEX_NUM]; //顶点数组
int vexnum, arcnum; //顶点数和边数
}Graph;
```
然后,我们可以编写创建图的函数:
```c
void CreateGraph(Graph *G)
{
printf("请输入顶点数和边数:");
scanf("%d %d", &G->vexnum, &G->arcnum);
printf("请输入各个顶点的数据:");
for(int i=0; i<G->vexnum; i++){
scanf("%d", &G->vertex[i].data);
G->vertex[i].firstarc = NULL; //初始化每个顶点的邻接表为空
}
printf("请输入各个边的起点和终点(用空格隔开):\n");
for(int k=0; k<G->arcnum; k++){
int i, j;
scanf("%d %d", &i, &j);
ArcNode *e = (ArcNode*)malloc(sizeof(ArcNode)); //创建一个新的边
e->adjvex = j;
e->nextarc = G->vertex[i].firstarc; //将新的边插入到邻接表的第一个位置
G->vertex[i].firstarc = e;
//因为是无向图,所以还要在j的邻接表中插入一条从j到i的边
e = (ArcNode*)malloc(sizeof(ArcNode));
e->adjvex = i;
e->nextarc = G->vertex[j].firstarc;
G->vertex[j].firstarc = e;
}
}
```
接下来,我们可以编写深度优先遍历和广度优先遍历的函数:
```c
//深度优先遍历
void DFS(Graph G, int v, bool visited[])
{
visited[v] = true; //标记当前顶点已被访问
printf("%d ", G.vertex[v].data); //输出当前顶点的数据
ArcNode *p = G.vertex[v].firstarc;
while(p != NULL){ //依次访问当前顶点的邻接点
if(!visited[p->adjvex]){
DFS(G, p->adjvex, visited);
}
p = p->nextarc;
}
}
//广度优先遍历
void BFS(Graph G, int v, bool visited[])
{
int queue[MAX_VERTEX_NUM]; //定义一个队列,保存待访问的顶点
int front = 0, rear = 0; //队头和队尾指针
queue[rear++] = v; //将当前顶点入队
visited[v] = true; //标记当前顶点已被访问
printf("%d ", G.vertex[v].data); //输出当前顶点的数据
while(front != rear){ //队列非空时循环
int w = queue[front++]; //取出队头元素
ArcNode *p = G.vertex[w].firstarc;
while(p != NULL){ //依次访问当前顶点的邻接点
if(!visited[p->adjvex]){
visited[p->adjvex] = true;
printf("%d ", G.vertex[p->adjvex].data);
queue[rear++] = p->adjvex; //将该邻接点入队
}
p = p->nextarc;
}
}
}
```
最后,我们可以在主函数中调用这些函数来测试:
```c
int main()
{
Graph G;
CreateGraph(&G);
bool visited[MAX_VERTEX_NUM] = {false}; //标记数组,初始化为false
printf("深度优先遍历:");
for(int i=0; i<G.vexnum; i++){
if(!visited[i]){
DFS(G, i, visited);
}
}
printf("\n广度优先遍历:");
for(int i=0; i<G.vexnum; i++){
visited[i] = false; //清空标记数组
}
for(int i=0; i<G.vexnum; i++){
if(!visited[i]){
BFS(G, i, visited);
}
}
return 0;
}
```
阅读全文