#include "graph.h" #include <stdio.h> #include <stdlib.h> void CreateAdj(AdjGraph &G,int A[MAXV][MAXV],int n,int e) //创建图的邻接表 { int i,j; ArcNode p; G=(AdjGraph )malloc(sizeof(AdjGraph)); for(i=0;i<n;i++) //给邻接表的头元素的指针域置初值 { G->adjlist[i].firstarc=NULL; } for(i=0;i<n;i++) //检查邻接表的每个元素 { for(j=n-1;j>=0;j--) { if(A[i][j]!=0&&A[i][j]!=INF) //存在一条边 { p=(ArcNode )malloc(sizeof(ArcNode)); //创建一个结点p p->adjvex=j; //存放邻接点 p->weight=A[i][j]; //存放权 p->nextarc=G->adjlist[i].firstarc; //采用头插法插入结点p G->adjlist[i].firstarc=p; } } } G->n=n; G->e=e; } void DispAdj(AdjGraph G) { int i; ArcNode p; for(i=0;i<G->n;i++) { p=G->adjlist[i].firstarc; printf("%3d: ",i); while(p!=NULL) { printf("%d[%d]→",p->adjvex,p->weight); p=p->nextarc; } printf("^\n"); } } void DestroyAdj(AdjGraph &G) { int i; ArcNode pre,p; for(i=0;i<G->n;i++) //扫描所有单链表 { pre=G->adjlist[i].firstarc; //p指向第i个单链表的头结点 if(pre!=NULL) { p=pre->nextarc; while(p!=NULL) //释放第i个单链表的所有结点 { free(pre); pre=p; p=p->nextarc; } free(pre); } } free(G); } //深度优先遍历 int visited[MAXV]; //全局数组,记录访问的点 void DFS(AdjGraph G,int v) { / Begin / / End **********/ }:请实现Begin与End之间的代码
时间: 2024-01-16 15:03:48 浏览: 76
根据题目要求,需要在`DFS`函数中实现深度优先遍历。下面给出一个较为详细的实现过程:
```c
void DFS(AdjGraph G, int v)
{
ArcNode p;
visited[v] = 1; // 标记顶点v已经被访问过
printf("%d ", v); // 输出访问顶点v的信息
p = G.adjlist[v].firstarc;
while(p != NULL) // 遍历顶点v的邻接点
{
if(!visited[p->adjvex]) // 如果邻接点未被访问,则递归访问该邻接点
{
DFS(G, p->adjvex);
}
p = p->nextarc; // 继续遍历下一个邻接点
}
}
```
在`DFS`函数中,首先标记当前顶点v已经被访问过,然后输出访问顶点v的信息。接着遍历顶点v的邻接点,如果邻接点未被访问,则递归访问该邻接点。最后继续遍历下一个邻接点。需要注意的是,在`DFS`函数外部需要定义一个全局数组`visited`,用于记录已经访问过的顶点。
相关问题
#include "graph.h" #include <stdio.h> #include <stdlib.h> void CreateAdj(AdjGraph *&G,int A[MAXV][MAXV],int n,int e) //创建图的邻接表 { int i,j; ArcNode *p; G=(AdjGraph *)malloc(sizeof(AdjGraph)); for(i=0;i<n;i++)
这是一个创建图的邻接表的函数实现,其中AdjGraph是图的邻接表结构体,定义如下:
```c
#define MAXV 100 // 最大顶点数
typedef struct ArcNode{ // 边结点
int adjvex; // 邻接点
struct ArcNode *next; // 指向下一个邻接点的指针
}ArcNode;
typedef struct VNode{ // 顶点结点
int data; // 顶点的数据
ArcNode *first; // 指向第一个邻接点的指针
}VNode, AdjList[MAXV];
typedef struct{ // 邻接表
AdjList vertices; // 存放顶点的数组
int vexnum, arcnum; // 顶点数和边数
}AdjGraph;
```
下面是CreateAdj函数的实现:
```c
void CreateAdj(AdjGraph *&G, int A[MAXV][MAXV], int n, int e)
{
int i, j;
ArcNode *p;
G = (AdjGraph *)malloc(sizeof(AdjGraph)); // 分配内存空间
for(i = 0; i < n; i++)
{
G->vertices[i].data = i; // 初始化顶点的数据
G->vertices[i].first = NULL; // 初始化指向第一个邻接点的指针
for(j = 0; j < n; j++)
{
if(A[i][j] != 0) // 如果顶点i和顶点j之间有边
{
p = (ArcNode *)malloc(sizeof(ArcNode)); // 创建边结点
p->adjvex = j; // 邻接点为j
p->next = G->vertices[i].first; // 将该边结点插入到顶点i的邻接表头部
G->vertices[i].first = p;
}
}
}
G->vexnum = n; // 顶点数为n
G->arcnum = e; // 边数为e
}
```
其中,A[MAXV][MAXV]是一个邻接矩阵,n是顶点数,e是边数。函数的作用是将邻接矩阵转换为邻接表存储法。
#pragma once #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <crtdbg.h>//add this header file to detect memory leaks #define MAXVER 5 #define true 1 #define false 0 //权重类型,此处为int typedef int DataType; typedef DataType DistanceMatrix; typedef struct { _Bool _visit; DataType _value; }MyVertex; typedef MyVertex ShortPathTable; typedef struct { int _vernum; DataType _matrix[MAXVER][MAXVER]; }MyGraph; void CreateGraph(MyGraph* G, DataType(*MyMatrix)[MAXVER]); void Dijkstra(MyGraph* G,int v,ShortPathTable* D); void FloydWarshall(MyGraph* G, DistanceMatrix(*D)[MAXVER]);根据头文件补全函数
好的,根据这个头文件,需要补全三个函数的代码实现,分别是CreateGraph、Dijkstra和FloydWarshall。
1. CreateGraph函数:
```
void CreateGraph(MyGraph* G, DataType(*MyMatrix)[MAXVER]) {
assert(G != NULL && MyMatrix != NULL);
G->_vernum = MAXVER;
for (int i = 0; i < MAXVER; i++) {
for (int j = 0; j < MAXVER; j++) {
G->_matrix[i][j] = MyMatrix[i][j];
}
}
}
```
这个函数的作用是创建一个图,并初始化它的邻接矩阵。这里假设邻接矩阵已经被赋值给了MyMatrix数组,函数会把它复制到图的_matrix数组中。注意,这里的图是一个无向图,如果需要创建有向图,需要根据具体情况修改代码。
2. Dijkstra函数:
这个函数的代码实现已经在之前的回答中给出了,可以直接使用。不过需要注意的是,这个函数中的MyGraph结构体中的_matrix数组是一个二维数组,用来存储图的邻接矩阵。如果要使用这个函数,需要先通过CreateGraph函数创建一个图,并把邻接矩阵存储在_matrix数组中。
3. FloydWarshall函数:
```
void FloydWarshall(MyGraph* G, DistanceMatrix(*D)[MAXVER]) {
assert(G != NULL && D != NULL);
int n = G->_vernum;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
(*D)[i][j] = G->_matrix[i][j];
}
}
for (int k = 0; k < n; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if ((*D)[i][j] > (*D)[i][k] + (*D)[k][j]) {
(*D)[i][j] = (*D)[i][k] + (*D)[k][j];
}
}
}
}
}
```
这个函数实现了Floyd-Warshall算法,用来计算图中任意两个点之间的最短路径。和Dijkstra算法类似,这个函数也需要一个图的指针和一个距离矩阵的指针作为参数。函数会把邻接矩阵复制到距离矩阵中,并通过三重循环计算任意两个点之间的最短路径。这里的距离矩阵是一个二维数组,用来存储任意两个点之间的距离。
阅读全文