无向图深度、广度遍历(邻接矩阵、邻接表)

在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
#define MAX_VEX_NUM 20
typedef struct
{
	char vertex[MAX_VEX_NUM];
	int arcs[MAX_VEX_NUM][MAX_VEX_NUM];
	int vex_num;
	int arc_num;
}Mgraph;
int LocateVex(Mgraph g,char v)
{
	int i;
	for(i=0;i<g.vex_num;i++)
	{
		if(g.vertex[i]==v)
		return i;
	}
	return-1;
}
void create_UDG(Mgraph &g)
{
	int i,j,k;
	char v1,v2;
	int cost;
	printf("请输入顶点个数,边的条数:");
	scanf("%d,%d",&g.vex_num,&g.arc_num);
	getchar();
	//构造顶点向量
	printf("请输入顶点信息(逐个 输入、回车):\n");
	for(i=0;i<g.vex_num;i++)
	{
		scanf("%c",&g.vertex[i]);
		getchar();
	}
	//初始化邻接矩阵
	for(i=0;i<g.vex_num;i++)
	for(j=0;j<g.vex_num;j++)
	g.arcs[i][j]=0;
	//构造邻接矩阵
	printf("请输入边的邻接点(输入字母以逗号相间):\n");
	for(k=0;k<g.arc_num;k++)
	{
		//输入边依附的顶点
		scanf("%c,%c",&v1,&v2);
		getchar();
		//确定v1和v2在G中的位置
		i=LocateVex(g,v1);
		j=LocateVex(g,v2);
		g.arcs[j][i]=g.arcs[i][j]=1;
	}
}
void out_UDG(Mgraph g)
{
	int i,j;
	printf("图的顶点是:\n");
	for(i=0;i<g.vex_num;i++)
	{
		printf("%c",g.vertex[i]);
	}
	printf("\n");
	printf("图的邻接矩阵是:\n");
	for(i=0;i<g.vex_num;i++)
	{
		for(j=0;j<g.vex_num;j++)
		printf("%8d",g.arcs[i][j]);
		printf("\n");
	}
}
int visited[MAX_VEX_NUM];
void DFS(Mgraph g,int i)
{
	int j;
	visited[i]=1;
	printf("%c",g.vertex[i]);
	for(j=0;j<g.vex_num;j++)
	{
		if(!visited[j]&&g.arcs[i][j])
		DFS(g,j);
	}
}
void DFSTraverse(Mgraph g)
{
	printf("深度优先遍历:");
	int i;
	for(i=0;i<g.vex_num;i++)visited[i]=0;
	for(i=0;i<g.vex_num;i++)
	{
		if(!visited[i])
		DFS(g,i);
	}
}
void BFSTraverse(Mgraph g)
{
	printf("广度优先遍历:");
	int u,v;
	for(u=0;u<g.vex_num;u++)visited[u]=0;
	for(u=0;u<g.vex_num;u++)
	if(!visited[u])
	{
		visited[u]=1;
		printf("%c",g.vertex[u]);
		for(v=0;v<g.vex_num;v++)
		if(!visited[v]&&g.arcs[u][v])
		{
			visited[v]=1;
			printf("%c",g.vertex[v]);
		}
	}
}
typedef struct ArcNode
{
	int adjvex;
	struct ArcNode *nextarc;
}ArcNode,*Arc;
typedef struct VNode
{
	char data;
	ArcNode *firstarc;
}VNode,AdjList[MAX_VEX_NUM];
typedef struct
{
	AdjList vertices;
	int vexnum,arcnum;
}ALGraph;
void creat__UDG(ALGraph &g)
{
	Arc p,q;
	int i,m[MAX_VEX_NUM],n[MAX_VEX_NUM];
	printf("请输入顶点个数、边的条数:");
	scanf("%d,%d",&g.vexnum,&g.arcnum);
	getchar();
	printf("请输入顶点信息(逐个 输入、回车):\n");
	for(i=1;i<=g.vexnum;i++)
	{
		scanf("%c",&g.vertices[i].data);
		getchar();
		g.vertices[i].firstarc=NULL;
	}
	printf("请输入边的邻接点标号(输入数字以逗号相间):\n");
	for(i=1;i<=g.arcnum;i++)
	{
		scanf("%d,%d",&m[i],&n[i]);
		getchar();
	}
	for(i=g.arcnum;i>0;i--)
	{
		p=(Arc)malloc(sizeof(ArcNode));
		q=(Arc)malloc(sizeof(ArcNode));
		p->adjvex=n[i];
		p->nextarc=g.vertices[m[i]].firstarc;
		g.vertices[m[i]].firstarc=p;
		q->adjvex=m[i];
		q->nextarc=g.vertices[n[i]].firstarc;
		g.vertices[n[i]].firstarc=q;
	}
}
void out__UDG(ALGraph &g)
{
	int i;
	printf("图的邻接表:\n");
	for(i=1;i<=g.vexnum;i++)
	{
		printf("%c:",g.vertices[i].data);
		while(g.vertices[i].firstarc->nextarc!=NULL)
		{
			printf("(%c)",g.vertices[g.vertices[i].firstarc->adjvex].data);
			printf("%d->",g.vertices[i].firstarc->adjvex);
			g.vertices[i].firstarc=g.vertices[i].firstarc->nextarc;
		}
		printf("(%c)",g.vertices[g.vertices[i].firstarc->adjvex].data);
		printf("%d\n",g.vertices[i].firstarc->adjvex);
	}
}
void DFS_(ALGraph G, int i)
{

	Arc p;
	visited[i]=1;
	printf("%c",G.vertices[i].data);
	p=G.vertices[i].firstarc;
	while(p)
	{
		if(!visited[p->adjvex])
			DFS_(G,p->adjvex);
		p=p->nextarc;
	}	
}
void DFS_Traverse(ALGraph G)
{
	printf("深度优先遍历:");
	for(int i=1;i<=G.vexnum;++i)
		visited[i]=0;
	for(int i=1;i<=G.vexnum;i++)
	{
		if (!visited[i])
			DFS_(G, i);
	}
}
void BFS_Traverse(ALGraph G)
{
	printf("广度优先遍历:");
	Arc p;
	int Qu[20],front,rear;
	int w,i;
	for(int i=0;i<MAX_VEX_NUM;i++)visited[i]=0;
	front=rear=0;
	printf("%c",G.vertices[1].data);
	visited[1]=1;
	rear=(rear+1)%20;
	Qu[rear]=1;
	while(front!=rear)
	{
		front=(front+1)%20;
		w=Qu[front];
		p=G.vertices[w].firstarc;
		while(p)
		{
			if(visited[p->adjvex]==0)
			{
				visited[p->adjvex]=1;
				printf("%c",G.vertices[p->adjvex].data);
				rear=(rear+1)%20;
				Qu[rear]=p->adjvex;
			}
			p=p->nextarc;
		}
	}
}
void menu()
{
	printf("*******请输入菜单选项*******\n");
	printf("1 以邻接矩阵为存储结构     *\n");
	printf("2 以邻接表为存储结构       *\n");
	printf("0 退出系统                 *\n");
}
int main()
{
	printf("bbb欢迎使用无向图遍历系统ddd\n");
	int flag;
	while(1)
	{
		menu();
		scanf("%d",&flag);
		getchar();
		switch(flag)
		{
			case 0:printf("正在退出,请稍后");
			       printf(".");
			       printf(".");
			       printf(".");
			       printf("bbbbbbbb欢迎下次使用dddddddd\n");
			       return 0;
			case 1:Mgraph p;
			       create_UDG(p);
			       DFSTraverse(p);
			       printf("\n");
			       BFSTraverse(p);
			       printf("\n");
			       out_UDG(p);
			       printf("****************************\n");
			       break;
			case 2:ALGraph q;
			       creat__UDG(q);
			       DFS_Traverse(q);
			       printf("\n");
			       BFS_Traverse(q);
			       printf("\n");
			       out__UDG(q);
			       printf("****************************\n");
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值