#include<stdio.h>
#include<stdlib.h>
#define MVNUM 100
#define MAXSIZE 5
typedef struct{
char vexs[MVNUM];//存储顶点
int weight;//权值
int arcs[MVNUM][MVNUM];//存储边
int vexnum,arcnum;//顶点个数和边个数
}AMGraph;
typedef struct Queue{
int front;
int rear;
int *data;
}Queue;
void InitQueue(Queue &Q){
Q.data=new int[MAXSIZE];
Q.front=Q.rear=0;
}
int IsFull(Queue &Q)
{
if((Q.rear+1)%MAXSIZE==Q.rear)
return 1;
else
return 0;
}
int IsEmpty(Queue Q)
{
if(Q.front==Q.rear)
return 1;
else
return 0;
}
int EnQueue(Queue &Q,int data)
{
if(IsFull(Q))
return 0;
else
{
Q.data[Q.rear]=data;
Q.rear=(Q.rear+1)%MAXSIZE;
return 1;
}
}
int DeQueue(Queue &Q){
if(IsEmpty(Q))
return -1;
else
{
int data=Q.data[Q.front];
Q.front=(Q.front+1)%MAXSIZE;
return data;
}
}
int Locate(AMGraph G,char v)
{
for(int i=0;i<G.vexnum;i++)
{
if(G.vexs[i]==v)
return i;
}
return -1;
}
void CreatGraph(AMGraph &G)
{ char v1,v2;//记录边对应的顶点
printf("输入总顶点树和总边数:\n");
scanf("%d%d",&G.vexnum,&G.arcnum);
printf("输入结点:\n");
for(int i=0;i<G.vexnum;i++)
{
scanf(" %c",&G.vexs[i]);//存入顶点信息
for(int j=0;j<G.vexnum;j++)
{
G.arcs[i][j]=0;//将边的权值初始化
}
}
for(int i=0;i<G.arcnum;i++)
{
printf("输入边对应的顶点及边的权值:\n");
scanf(" %c %c %d",&v1,&v2,&G.weight);
int pos1=Locate(G,v1);
int pos2=Locate(G,v2);//记录顶点在邻接矩阵中对应的位置
G.arcs[pos1][pos2]=G.weight;
G.arcs[pos2][pos1]=G.arcs[pos1][pos2];//将权值存入矩阵
}
}
void PrintGraph(AMGraph G)
{
for(int i=0;i<G.vexnum;i++)
{
for(int j=0;j<G.vexnum;j++)
{
printf("%d ",G.arcs[i][j]);
}
printf("\n");
}
}
void DFS(AMGraph G,int *visited,int index)
{
printf("%c",G.vexs[index]);
visited[index]=1;
for(int i=0;i<G.vexnum;i++)
{if(G.arcs[index][i]!=0&&visited[i]!=1)//求开始顶点的第一个邻接点
DFS(G,visited,i);//递归求邻接点的第一个邻接点
}
}
void BFS(AMGraph G,int *visited,int index,Queue &Q)
{
printf("%c",G.vexs[index]);
visited[index]=1;
EnQueue(Q,index);
while(!IsEmpty(Q))
{
int i=DeQueue(Q);
for(int j=0;j<G.vexnum;j++)
{
if(G.arcs[i][j]!=0&&visited[j]!=1)
{
printf("%c",G.vexs[j]);
visited[j]=1;
EnQueue(Q,j);
}
}
}
}
int main()
{
AMGraph G;
Queue Q;
InitQueue(Q);
CreatGraph(G);
int index;
int visited[G.vexnum]={0};
PrintGraph(G);
printf("请输入深度遍历开始顶点所在位置:\n");
scanf("%d",&index);
DFS(G,visited,index);
printf("\n");
printf("请输入广度遍历开始顶点所在位置:\n");
scanf("%d",&index);
for(int i=0;i<G.vexnum;i++)
{
visited[i]=0;
}
BFS(G,visited,index,Q);
return 0;
}
图的创建bfs dfs
最新推荐文章于 2024-07-25 14:57:29 发布