1、编写按键盘输入的数据建立图的邻接矩阵存储; 2、编写图的深度优先遍历程序; 3、编写图的广度优先遍历程序。
时间: 2023-12-13 20:31:49 浏览: 127
图的存储结构(邻接表或邻接矩阵),的深度优先搜索遍历路径。
5星 · 资源好评率100%
1、按键盘输入的数据建立图的邻接矩阵存储的步骤如下:
```c
//定义邻接矩阵
typedef struct {
Vertextype Vertex[MAXVertexNum];//顶点表
Edgetype Edge[MAXVertexNum][MAXVertexNum];//邻接矩阵,边表
int vernum, arcnum; //图的顶点数和弧数
}MGraph;
//建立无向图的邻接矩阵存储
void CreateMGraph(MGraph* G) {
int i, j, k, w;
printf("请输入图的顶点数和边数:\n");
scanf_s("%d%d", &G->vernum, &G->arcnum);
getchar();//吃掉回车符
printf("请输入图的顶点信息:\n");
for (i = 0; i < G->vernum; i++) {
scanf_s("%c", &G->Vertex[i]);
getchar();//吃掉回车符
}
for (i = 0; i < G->vernum; i++) {
for (j = 0; j < G->vernum; j++) {
G->Edge[i][j] = 0;//初始化邻接矩阵
}
}
printf("请输入每条边的两个顶点及其权值:\n");
for (k = 0; k < G->arcnum; k++) {
Vertextype v1, v2;
printf("请输入第%d条边的两个顶点及其权值:\n", k + 1);
scanf_s("%c%c%d", &v1, 1, &v2, 1, &w);
getchar();//吃掉回车符
i = LocateVex(G, v1);//查找顶点v1在图中的位置
j = LocateVex(G, v2);//查找顶点v2在图中的位置
G->Edge[i][j] = w;//建立边
G->Edge[j][i] = w;//无向图对称
}
}
```
2、图的深度优先遍历程序的步骤如下:
```c
//定义访问标志数组
int visited[MAXVertexNum];
//深度优先遍历
void DFS(MGraph* G, int v) {
int w;
visited[v] = 1;//标记顶点v已访问
printf("%c ", G->Vertex[v]);//输出顶点v的信息
for (w = 0; w < G->vernum; w++) {
if (G->Edge[v][w] != 0 && !visited[w]) {//如果顶点v和顶点w之间有边且顶点w未被访问
DFS(G, w);//递归访问顶点w
}
}
}
//深度优先遍历图
void DFSTraverse(MGraph* G) {
int v;
for (v = 0; v < G->vernum; v++) {
visited[v] = 0;//初始化访问标志数组
}
for (v = 0; v < G->vernum; v++) {
if (!visited[v]) {//如果顶点v未被访问
DFS(G, v);//从顶点v开始深度优先遍历图
}
}
}
```
3、图的广度优先遍历程序的步骤如下:
```c
//定义队列
typedef struct {
int data[MAXVertexNum];//队列元素
int front, rear;//队头和队尾指针
}Queue;
//初始化队列
void InitQueue(Queue* Q) {
Q->front = Q->rear = 0;
}
//判断队列是否为空
int QueueEmpty(Queue* Q) {
return Q->front == Q->rear;
}
//入队
void EnQueue(Queue* Q, int x) {
if ((Q->rear + 1) % MAXVertexNum == Q->front) {//队列已满
return;
}
Q->data[Q->rear] = x;
Q->rear = (Q->rear + 1) % MAXVertexNum;
}
//出队
void DeQueue(Queue* Q, int* x) {
if (Q->front == Q->rear) {//队列为空
return;
}
*x = Q->data[Q->front];
Q->front = (Q->front + 1) % MAXVertexNum;
}
//广度优先遍历
void BFS(MGraph* G, int v) {
int w;
Queue Q;
InitQueue(&Q);//初始化队列
visited[v] = 1;//标记顶点v已访问
printf("%c ", G->Vertex[v]);//输出顶点v的信息
EnQueue(&Q, v);//顶点v入队
while (!QueueEmpty(&Q)) {//队列不为空
DeQueue(&Q, &v);//顶点v出队
for (w = 0; w < G->vernum; w++) {
if (G->Edge[v][w] != 0 && !visited[w]) {//如果顶点v和顶点w之间有边且顶点w未被访问
visited[w] = 1;//标记顶点w已访问
printf("%c ", G->Vertex[w]);//输出顶点w的信息
EnQueue(&Q, w);//顶点w入队
}
}
}
}
//广度优先遍历图
void BFSTraverse(MGraph* G) {
int v;
for (v = 0; v < G->vernum; v++) {
visited[v] = 0;//初始化访问标志数组
}
for (v = 0; v < G->vernum; v++) {
if (!visited[v]) {//如果顶点v未被访问
BFS(G, v);//从顶点v开始广度优先遍历图
}
}
}
```
阅读全文