用c语言实现,题目如下:内容:构建图的邻接矩阵、邻接表存储结构,实现图的深度优先搜索遍历、广度优先搜索遍历。 要求: (1)创建图时,输入图中的顶点以及图中的边(或弧)。 (2)输出图的深度优先遍历序列和广度优先遍历序列。
时间: 2024-02-13 12:02:39 浏览: 86
建立图的邻接矩阵或邻接表存储并在此基础上实现图的深度优先遍历和广度优先遍历.doc
5星 · 资源好评率100%
好的,我会尽力回答这个问题。
首先,我们需要定义一个图的结构体,包括顶点数、边数以及邻接矩阵和邻接表两种数据结构:
```c
#define MAX_VERTEX_NUM 100 // 最大顶点数
// 边的结构体
typedef struct {
int start; // 起点
int end; // 终点
int weight; // 权值(如果是无权图,则为1)
} Edge;
// 图的结构体
typedef struct {
int vertex_num; // 顶点数
int edge_num; // 边数
int adj_matrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
struct {
int vertex; // 顶点编号
struct EdgeNode* first_edge; // 指向第一条依附该顶点的边的指针
} adj_list[MAX_VERTEX_NUM]; // 邻接表
} Graph;
```
接下来,我们需要实现图的创建函数,可以通过用户输入来构建图的邻接矩阵和邻接表:
```c
void createGraph(Graph* graph) {
printf("请输入图的顶点数和边数(用空格隔开):");
scanf("%d %d", &graph->vertex_num, &graph->edge_num);
// 初始化邻接矩阵
for (int i = 0; i < graph->vertex_num; i++) {
for (int j = 0; j < graph->vertex_num; j++) {
graph->adj_matrix[i][j] = 0;
}
}
// 初始化邻接表
for (int i = 0; i < graph->vertex_num; i++) {
graph->adj_list[i].vertex = i;
graph->adj_list[i].first_edge = NULL;
}
// 输入每条边的信息,并构建邻接矩阵和邻接表
for (int i = 0; i < graph->edge_num; i++) {
printf("请输入第%d条边的起点、终点和权值(用空格隔开):", i + 1);
int start, end, weight;
scanf("%d %d %d", &start, &end, &weight);
graph->adj_matrix[start][end] = weight;
graph->adj_matrix[end][start] = weight;
Edge* edge = (Edge*)malloc(sizeof(Edge));
edge->start = start;
edge->end = end;
edge->weight = weight;
EdgeNode* node = (EdgeNode*)malloc(sizeof(EdgeNode));
node->edge = edge;
node->next = graph->adj_list[start].first_edge;
graph->adj_list[start].first_edge = node;
node = (EdgeNode*)malloc(sizeof(EdgeNode));
node->edge = edge;
node->next = graph->adj_list[end].first_edge;
graph->adj_list[end].first_edge = node;
}
}
```
接下来,我们可以实现图的深度优先搜索遍历和广度优先搜索遍历。这里使用栈和队列来实现:
```c
// 深度优先搜索遍历
void dfs(Graph* graph, int vertex, bool* visited) {
printf("%d ", vertex);
visited[vertex] = true;
for (int i = 0; i < graph->vertex_num; i++) {
if (graph->adj_matrix[vertex][i] != 0 && !visited[i]) {
dfs(graph, i, visited);
}
}
}
void dfsTraversal(Graph* graph) {
bool visited[MAX_VERTEX_NUM] = {false};
for (int i = 0; i < graph->vertex_num; i++) {
if (!visited[i]) {
dfs(graph, i, visited);
}
}
}
// 广度优先搜索遍历
void bfsTraversal(Graph* graph) {
bool visited[MAX_VERTEX_NUM] = {false};
Queue queue;
initQueue(&queue);
for (int i = 0; i < graph->vertex_num; i++) {
if (!visited[i]) {
printf("%d ", i);
visited[i] = true;
enqueue(&queue, i);
while (!isEmpty(&queue)) {
int vertex = dequeue(&queue);
for (EdgeNode* p = graph->adj_list[vertex].first_edge; p != NULL; p = p->next) {
int end = p->edge->end;
if (!visited[end]) {
printf("%d ", end);
visited[end] = true;
enqueue(&queue, end);
}
}
}
}
}
}
```
最后,我们可以在 main 函数中调用这些函数:
```c
int main() {
Graph graph;
createGraph(&graph);
printf("深度优先搜索遍历序列:");
dfsTraversal(&graph);
printf("\n");
printf("广度优先搜索遍历序列:");
bfsTraversal(&graph);
printf("\n");
return 0;
}
```
这样,我们就完成了题目中所要求的内容。完整代码如下:
阅读全文