1.先依次输入有向图的顶点信息,再依次输入有向图的弧信息,建立图的邻接表存储结构并将其打印输出; 2.在1中建立的有向图的邻接表存储结构基础上使用非递归算法对图进行深度优先搜索遍历并输出顶点序列; 3.在1中建立的有向图的邻接表存储结构基础上对图进行广度优先搜索遍历并输出顶点序列。用C语言实现
时间: 2024-02-11 18:07:02 浏览: 41
好的,我明白了你的问题。以下是对你的问题的回答:
1. 建立有向图邻接表存储结构并打印输出
```c
#include <stdio.h>
#include <stdlib.h>
// 定义邻接表中的边结构体
typedef struct EdgeNode {
int adjvex; // 相邻结点在顶点数组中的下标
struct EdgeNode* next; // 指向下一个边结点的指针
} EdgeNode;
// 定义顶点结构体
typedef struct VertexNode {
char data; // 顶点数据
EdgeNode* firstEdge; // 指向第一个边结点的指针
} VertexNode, AdjList[100];
// 定义邻接表类型
typedef struct {
AdjList adjList; // 邻接表数组
int numVertexes, numEdges; // 顶点数和边数
} GraphAdjList;
// 初始化邻接表
void initGraph(GraphAdjList* g) {
int i;
printf("请输入顶点数和边数:");
scanf("%d%d", &g->numVertexes, &g->numEdges);
getchar(); // 输入缓冲区中可能还有一个回车符,用getchar()把它取出来
printf("请输入每个顶点的信息:");
for (i = 0; i < g->numVertexes; i++) {
scanf("%c", &g->adjList[i].data);
g->adjList[i].firstEdge = NULL;
}
getchar(); // 同上
printf("请输入每条边所连接的两个顶点的下标和权值:\n");
for (i = 0; i < g->numEdges; i++) {
int u, v;
EdgeNode* e;
scanf("%d%d", &u, &v);
e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->adjvex = v;
e->next = g->adjList[u].firstEdge;
g->adjList[u].firstEdge = e;
}
}
// 打印邻接表
void printGraph(GraphAdjList g) {
int i;
EdgeNode* e;
printf("邻接表内容如下:\n");
for (i = 0; i < g.numVertexes; i++) {
printf("%c -> ", g.adjList[i].data);
e = g.adjList[i].firstEdge;
while (e) {
printf("%d -> ", e->adjvex);
e = e->next;
}
printf("NULL\n");
}
}
```
2. 深度优先搜索遍历
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
// 定义邻接表中的边结构体
typedef struct EdgeNode {
int adjvex; // 相邻结点在顶点数组中的下标
struct EdgeNode* next; // 指向下一个边结点的指针
} EdgeNode;
// 定义顶点结构体
typedef struct VertexNode {
char data; // 顶点数据
EdgeNode* firstEdge; // 指向第一个边结点的指针
} VertexNode, AdjList[100];
// 定义邻接表类型
typedef struct {
AdjList adjList; // 邻接表数组
int numVertexes, numEdges; // 顶点数和边数
} GraphAdjList;
// 初始化邻接表
void initGraph(GraphAdjList* g) {
int i;
printf("请输入顶点数和边数:");
scanf("%d%d", &g->numVertexes, &g->numEdges);
getchar(); // 输入缓冲区中可能还有一个回车符,用getchar()把它取出来
printf("请输入每个顶点的信息:");
for (i = 0; i < g->numVertexes; i++) {
scanf("%c", &g->adjList[i].data);
g->adjList[i].firstEdge = NULL;
}
getchar(); // 同上
printf("请输入每条边所连接的两个顶点的下标和权值:\n");
for (i = 0; i < g->numEdges; i++) {
int u, v;
EdgeNode* e;
scanf("%d%d", &u, &v);
e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->adjvex = v;
e->next = g->adjList[u].firstEdge;
g->adjList[u].firstEdge = e;
}
}
// 深度优先搜索遍历
void DFS(GraphAdjList g, int i, bool* visited) {
EdgeNode* e;
visited[i] = true;
printf("%c ", g.adjList[i].data);
e = g.adjList[i].firstEdge;
while (e) {
if (!visited[e->adjvex]) {
DFS(g, e->adjvex, visited);
}
e = e->next;
}
}
// 非递归实现深度优先搜索遍历
void DFSNonRecursive(GraphAdjList g, int i, bool* visited) {
EdgeNode* e;
int stack[100], top = -1;
visited[i] = true;
printf("%c ", g.adjList[i].data);
stack[++top] = i;
while (top != -1) {
int j = stack[top--];
e = g.adjList[j].firstEdge;
while (e) {
if (!visited[e->adjvex]) {
visited[e->adjvex] = true;
printf("%c ", g.adjList[e->adjvex].data);
stack[++top] = e->adjvex;
}
e = e->next;
}
}
}
// 广度优先搜索遍历
void BFS(GraphAdjList g, int i, bool* visited) {
EdgeNode* e;
int queue[100], front = 0, rear = 0;
visited[i] = true;
printf("%c ", g.adjList[i].data);
queue[rear++] = i;
while (front != rear) {
int j = queue[front++];
e = g.adjList[j].firstEdge;
while (e) {
if (!visited[e->adjvex]) {
visited[e->adjvex] = true;
printf("%c ", g.adjList[e->adjvex].data);
queue[rear++] = e->adjvex;
}
e = e->next;
}
}
}
// 打印邻接表
void printGraph(GraphAdjList g) {
int i;
EdgeNode* e;
printf("邻接表内容如下:\n");
for (i = 0; i < g.numVertexes; i++) {
printf("%c -> ", g.adjList[i].data);
e = g.adjList[i].firstEdge;
while (e) {
printf("%d -> ", e->adjvex);
e = e->next;
}
printf("NULL\n");
}
}
int main() {
GraphAdjList g;
bool visited[100];
memset(visited, false, sizeof(visited));
initGraph(&g);
printGraph(g);
printf("深度优先搜索遍历结果:");
DFS(g, 0, visited);
printf("\n非递归实现深度优先搜索遍历结果:");
memset(visited, false, sizeof(visited));
DFSNonRecursive(g, 0, visited);
printf("\n广度优先搜索遍历结果:");
memset(visited, false, sizeof(visited));
BFS(g, 0, visited);
return 0;
}
```
阅读全文