c语言描述数据结构,图的存储及遍历(矩阵/邻接矩阵;深度/广度优先遍历)

在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>

#define Maxsize 10
typedef int DataType;
typedef struct Graph
{
	DataType vertex[Maxsize];    //数组v存放顶点信息 
	int arc[Maxsize][Maxsize];	//arc数组存放边信息	
	int n,e;					//n个顶点,e条边 

}MG;


typedef struct SeqQ
{
	int front,rear;
	DataType data[Maxsize];
}SQ;

//调用InitGraph函数完成图的存储,(邻接矩阵和邻接表存储) 
void InitGraph(MG*G,DataType a[],int n,int e)
{
	int i,j,k;
	G->n = n;
	G->e = e;
	for(i=0;i<n;i++)
	{
		G->vertex[i] = a[i];

	}
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			G->arc[i][j]=0;
		}
	//	printf("\n");
	}
	for(k=0;k<e;k++)
	{
		printf("请输入边依附的两个顶点");
		scanf("%d,%d",&i,&j);
		G->arc[i][j]=1;
		G->arc[j][i]=1;
	}


}

//输出邻接矩阵/邻接表,检查图的存储是否正确 
void Print(MG *G)
{
	int i,j;
	for(i=0;i<G->n;i++)
	{
		for(j=0;j<G->n;j++)
		{
			printf("%3d",G->arc[i][j]);
		}
		printf("\n");
	}
}

//深度优先遍历
int visited[Maxsize] = {0};
void DFS(MG *G,int v)
{
	int j;
	printf("%3d",G->vertex[v]); 
	visited[v] = 1;
	for(j=0;j<G->n;j++){
		if(G->arc[v][j]==1&& visited[j]==0)   //如果j是v的一个邻接点并且没有访问 
			DFS(G,j);
	}
 } 
 
 //广度优先遍历
 void BFS(MG *G,int v)
 {
 	int j; 
 	int visited[Maxsize] ={0} ;  //使用是迭代法 所以采用局部变量 
 	SQ Q;
 	Q.front=Q.rear=-1;		//给队列初始化   表明是一个空队列 
 	
 	printf("%d",G->vertex[v]);
 	visited[v]=1;
 	
 //	Q.rear++;    //入队时先进行队尾加一的操作 
    Q.rear = (Q.rear+1)%Maxsize;
	Q.data[Q.rear] = v;		//入队操作  
    while(Q.front!=Q.rear){   //循环结束条件 
     //	Q.front++; 
   	 	Q.front = (Q.front+1)%Maxsize;
		v=Q.data[Q.front];        //取队头元素,但是此时对头为-1,不能使用在使用之前进行加1操作 
    	for(j=0;j<G->n;j++){             //找v的所有邻接点 
    	
	  		if(G->arc[v][j]==1&& visited[j]==0)   //如果j是v的一个邻接点并且没有访问 
	           {
	           	printf("%3d",G->vertex[j]);  //输出邻接点 
				visited[j]=1; 				//设为以访问 
	           	Q.rear=(Q.rear+1)%Maxsize;
	     		Q.data[Q.rear]=j;		//j 元素入队操作 
			   } 
	   }	
	} 	
  } 
//主函数,完成节点个数和变数的初始化
//将素有的节点信息存放到数组a里边
//调用函数建立图 
int main()
{
	MG G;
	DataType a[Maxsize];
	int n,e,i;
	printf("请输入顶点的个数和边数");
	scanf("%d,%d",&n,&e);
	printf("请输入顶点信息,\n");
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	InitGraph(&G,a,n,e);
	Print(&G);
	
	printf("图G的深度优先遍历,\n");
	DFS(&G,0); 
	printf("\n"); 
	
	printf("图G的广度优先遍历,\n");
	BFS(&G,0);

	

}

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值