C语言邻接矩阵有向带权图并实现输出、计算各个顶点的入度、深度优先遍历、广度优先遍历功能
时间: 2023-07-10 13:18:51 浏览: 198
好的,我可以帮你回答这个问题。以下是C语言实现邻接矩阵有向带权图的代码,包括输出、计算各个顶点的入度、深度优先遍历、广度优先遍历功能:
```c
#include<stdio.h>
#include<stdlib.h>
#define MAXVEX 100
#define INF 65535
typedef struct{
int vexs[MAXVEX]; //存储顶点信息
int arc[MAXVEX][MAXVEX]; //存储图的邻接矩阵信息
int numVertexes,numEdges; //顶点数和边数
}MGraph;
void CreateMGraph(MGraph *G){
int i,j,k,w;
printf("请输入顶点数和边数:\n");
scanf("%d%d",&G->numVertexes,&G->numEdges);
for(i=0;i<G->numVertexes;i++){
printf("请输入顶点信息:\n");
scanf("%d",&G->vexs[i]);
}
for(i=0;i<G->numVertexes;i++){
for(j=0;j<G->numVertexes;j++){
G->arc[i][j]=INF; //邻接矩阵初始化
}
}
for(k=0;k<G->numEdges;k++){
printf("请输入边的起点和终点及权值:\n");
scanf("%d%d%d",&i,&j,&w);
G->arc[i][j]=w; //有向图存储
}
}
void PrintMGraph(MGraph G){ //输出邻接矩阵
int i,j;
printf("邻接矩阵如下:\n");
for(i=0;i<G.numVertexes;i++){
for(j=0;j<G.numVertexes;j++){
printf("%d ",G.arc[i][j]);
}
printf("\n");
}
}
void InDegree(MGraph G){ //计算各个顶点的入度
int i,j,indegree;
for(i=0;i<G.numVertexes;i++){
indegree=0;
for(j=0;j<G.numVertexes;j++){
if(G.arc[j][i]!=INF){
indegree++;
}
}
printf("顶点%d的入度为%d\n",G.vexs[i],indegree);
}
}
void DFS(MGraph G,int i,int *visited){ //深度优先遍历
int j;
visited[i]=1;
printf("%d ",G.vexs[i]); //输出遍历结果
for(j=0;j<G.numVertexes;j++){
if(G.arc[i][j]!=INF && !visited[j]){
DFS(G,j,visited);
}
}
}
void DFSTraverse(MGraph G){ //深度优先遍历整张图
int i;
int visited[MAXVEX];
for(i=0;i<G.numVertexes;i++){
visited[i]=0; //初始化为0
}
printf("深度优先遍历结果为:\n");
for(i=0;i<G.numVertexes;i++){
if(!visited[i]){ //未被访问过的进行遍历
DFS(G,i,visited);
}
}
}
void BFS(MGraph G,int i,int *visited){ //广度优先遍历
int j;
int queue[MAXVEX],front=0,rear=0;
printf("%d ",G.vexs[i]); //输出遍历结果
visited[i]=1;
queue[rear++]=i; //进队列
while(front<rear){
j=queue[front++]; //出队列
for(i=0;i<G.numVertexes;i++){
if(G.arc[j][i]!=INF && !visited[i]){
printf("%d ",G.vexs[i]);
visited[i]=1;
queue[rear++]=i; //入队列
}
}
}
}
void BFSTraverse(MGraph G){ //广度优先遍历整张图
int i;
int visited[MAXVEX];
for(i=0;i<G.numVertexes;i++){
visited[i]=0; //初始化为0
}
printf("广度优先遍历结果为:\n");
for(i=0;i<G.numVertexes;i++){
if(!visited[i]){ //未被访问过的进行遍历
BFS(G,i,visited);
}
}
}
int main(){
MGraph G;
CreateMGraph(&G);
PrintMGraph(G);
InDegree(G);
DFSTraverse(G);
printf("\n");
BFSTraverse(G);
printf("\n");
return 0;
}
```
希望这个代码可以帮助到你,如果还有其他问题可以继续问我。
阅读全文