数据结构代码练习07

关于图

//图的结构体 
//邻接表存储: 
typedef struct ArcNode{
	int adjvex;//边指向结点的位置 
	struct ArcNode *nextarc;	
}ArcNode,*Node;//边结点结构体

typedef struct{
	int data;
	ArcNode *firstarc;
}Vnode;//顶点结构体

typedef struct{
	Vnode adjlist[maxsize];
	int numver,numedg;
}AGraph;

//邻接矩阵存储
typedef struct{
	char verticle[maxsize];
	int Edge[maxsize][maxsize];
	int numver,numedg;
}mgraph; 
//头插法建立图(邻接表结构体)
AGraph *aaaa(int v,int e){
	AGraph *G=new AGraph;
	G->numver=v;
	G->numedg =e;
	for(int i=0;i<v;++i)
		G->adjlist[i].firstarc=NULL;
	for(int i=0;i<e;++i){
		int v1,v2;
		scanf("%d",&v1);
		scanf("%d",&v2);
		ArcNode *p=new ArcNode;
		p->adjvex=v2;
		p->nextarc=G->adjlist[v].firstarc;
		G->adjlist[v].firstarc=p;
		ArcNode *q=new ArcNode;
		q->adjvex=v1;
		q->nextarc=G->adjlist[v2].firstarc;
		G->adjlist[v2].firstarc=q; 
	}
	return G; 
} 

//
//图的广度优先遍历(BFS)
void BFS(AGraph *G,int v,int visit[]){
	for(int i=0;i<G->numver;++i)
		visit[i]=0;
	int que[maxsize];
	int front=0,rear=0;
	printf("%d",v);
	que[++rear]=v;
	while(front!=rear){
		int v=que[++front];
		ArcNode *p=G->adjlist[v].firstarc;
		while(p!=NULL){
			if(visit[p->adjvex]==0){
				printf("%d",p->adjvex)
			}
			p=p->nextarc;
		}
	}
} 

//
//图的深度优先遍历(DFS)
void DFS(AGraph *G,int v,int visit[]){
	visit[v]=1;
	printf("%d",v);
	ArcNode *p=G->adjlist[v].firstarc;
	while(p!=NULL){
		if(visit[p->adjvex]==0)
			DFS(G,p->adjvex,visit);
		p=p->nextarc;
	} 
} 

//
//图采用邻接表存储,设计算法判断i和j结点之间是否有路径 
bool DFS1(AGraph *G,int i,int j){
	int k,visit[maxsize];
	for(k=0;k<G->numver;++k)
		visit[k]=0;
		DFS(G,i,visit);
		if(visit[j]==1)
			return true;
		else
			return false;
} 

//
//设计算法判断无向图是否是一棵树
void fun(AGraph *G,int v,int &vn,int &en,int visit[]){
	visit[v]=1;
	++vn;
	ArcNode *p=G->adjlist[v].firstarc;
	while(p!=NULL){
		++en;
		if(visit[p->adjvex]==0)
			fun(G,p->adjvex.vn,en,visit);
	}
} 
bool GisTree(AGraph *G){
	int vn=0,en=0;
	int visit[maxsize];
	for(int i=0;i<G->numver,++i)
		visit[i]=0;
	fun(G,l,vn,en,visit);
	if(vn==G->numver&&(G->numver-1)==en/2)
		return true;
	else
		return false;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值