图的创建bfs dfs

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值