c语言实现输入无向图的顶点数、边数及各条边的顶点对,建立用邻接表表示的无向图。 并对图进行深度优先搜索和广度优先搜索遍历,并分别输出其遍历序列。
时间: 2023-12-14 09:40:18 浏览: 80
C语言 输入无向图连通图的顶点数、顶点信息、边数、顶点对序列及遍历的起始点序号,输出深度优先遍历序列
5星 · 资源好评率100%
以下是C语言实现输入无向图的顶点数、边数及各条边的顶点对,建立用邻接表表示的无向图。并对图进行深度优先搜索和广度优先搜索遍历,并分别输出其遍历序列的代码:
```c
#include<stdio.h>
#include<stdlib.h>
#define MAX_VERTEX_NUM 50 //最大顶点数
//邻接表节点结构体
typedef struct node{
int adjvex; //邻接点在顶点数组中的下标
struct node *next; //指向下一邻接点的指针
}EdgeNode;
//顶点表结构体
typedef struct{
char vertex; //顶点值
EdgeNode *firstedge; //指向第一个邻接点的指针
}VertexNode;
//图结构体
typedef struct{
VertexNode adjlist[MAX_VERTEX_NUM]; //邻接表
int vertexnum; //顶点数
int edgenum; //边数
}GraphAdjList;
//初始化邻接表
void InitGraph(GraphAdjList *G);
//添加边
void AddEdge(GraphAdjList *G, int u, int v);
//深度优先搜索遍历
void DFS(GraphAdjList G, int v, int visited[]);
//深度优先搜索
void DFSTraverse(GraphAdjList G);
//广度优先搜索遍历
void BFS(GraphAdjList G, int v, int visited[], int queue[], int *head, int *tail);
//广度优先搜索
void BFSTraverse(GraphAdjList G);
int main(){
GraphAdjList G;
InitGraph(&G); //初始化邻接表
int n, m, i, u, v;
printf("请输入顶点数和边数:");
scanf("%d%d", &n, &m);
G.vertexnum = n;
G.edgenum = m;
getchar();
for(i=0; i<n; i++){
printf("请输入第%d个顶点的值:", i+1);
scanf("%c", &G.adjlist[i].vertex);
G.adjlist[i].firstedge = NULL;
getchar();
}
for(i=0; i<m; i++){
printf("请输入第%d条边的两个顶点下标:", i+1);
scanf("%d%d", &u, &v);
AddEdge(&G, u-1, v-1);
AddEdge(&G, v-1, u-1);
}
printf("深度优先搜索遍历序列:");
DFSTraverse(G);
printf("\n广度优先搜索遍历序列:");
BFSTraverse(G);
return 0;
}
//初始化邻接表
void InitGraph(GraphAdjList *G){
int i;
for(i=0; i<MAX_VERTEX_NUM; i++){
G->adjlist[i].vertex = ' ';
G->adjlist[i].firstedge = NULL;
}
}
//添加边
void AddEdge(GraphAdjList *G, int u, int v){
EdgeNode *e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->adjvex = v;
e->next = G->adjlist[u].firstedge;
G->adjlist[u].firstedge = e;
}
//深度优先搜索遍历
void DFS(GraphAdjList G, int v, int visited[]){
visited[v] = 1; //标记为已访问
printf("%c ", G.adjlist[v].vertex); //输出遍历到的顶点值
EdgeNode *e = G.adjlist[v].firstedge;
while(e){
if(!visited[e->adjvex]){ //若该邻接点未被访问,则递归搜索它
DFS(G, e->adjvex, visited);
}
e = e->next;
}
}
//深度优先搜索
void DFSTraverse(GraphAdjList G){
int visited[MAX_VERTEX_NUM] = {0}; //初始化所有顶点均未被访问
int i;
for(i=0; i<G.vertexnum; i++){
if(!visited[i]){ //若该顶点未被访问,则从该顶点开始深度优先搜索
DFS(G, i, visited);
}
}
}
//广度优先搜索遍历
void BFS(GraphAdjList G, int v, int visited[], int queue[], int *head, int *tail){
visited[v] = 1; //标记为已访问
printf("%c ", G.adjlist[v].vertex); //输出遍历到的顶点值
queue[(*tail)++] = v; //将该顶点入队
EdgeNode *e;
while((*head) < (*tail)){ //当队列非空时
e = G.adjlist[queue[(*head)++]].firstedge;
while(e){
if(!visited[e->adjvex]){ //若该邻接点未被访问,则标记为已访问并入队
visited[e->adjvex] = 1;
printf("%c ", G.adjlist[e->adjvex].vertex);
queue[(*tail)++] = e->adjvex;
}
e = e->next;
}
}
}
//广度优先搜索
void BFSTraverse(GraphAdjList G){
int visited[MAX_VERTEX_NUM] = {0}; //初始化所有顶点均未被访问
int queue[MAX_VERTEX_NUM], head=0, tail=0; //定义队列
int i;
for(i=0; i<G.vertexnum; i++){
if(!visited[i]){ //若该顶点未被访问,则从该顶点开始广度优先搜索
BFS(G, i, visited, queue, &head, &tail);
}
}
}
```
其中,深度优先搜索遍历的时间复杂度为O(|V|+|E|),广度优先搜索遍历的时间复杂度为O(|V|+|E|)。其中|V|为顶点数,|E|为边数。
阅读全文