【数据结构】图的深度优先遍历 广度优先遍历

 文件操作比直接输入方便许多

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define M 20
 
/*邻接表的储存结构*/
typedef struct node /*表结点 或者 边表结点*/
{
	int adjvex;
	struct node *next;
}edgenode;
 
typedef struct vnode /*头结点*/
{
	char vertex;
	edgenode *firsteage;
}vertexnode;
 
typedef struct	/*邻接表类型*/
{
	vertexnode adjlist[M];
	int n,e;
}linkedgraph;
 
int vis[M];

void creat (linkedgraph *g,int c)
{
	int i,j,k;
	edgenode *s;
	FILE *f;
	f=fopen("test.txt","r");
	if(f)
	{
		fscanf(f,"%d%d",&g->n,&g->e);
		for(i=0;i<g->n;i++)
		{
			fscanf(f,"%1s",&g->adjlist[i].vertex);
			g->adjlist[i].firsteage=NULL;
		}
		for(k=0;k<g->e;k++)
		{
			fscanf(f,"%d%d",&i,&j);
			s=(edgenode*)malloc(sizeof(edgenode));
			s->adjvex=j;
			s->next=g->adjlist[i].firsteage;
			g->adjlist[i].firsteage=s;
			if(c==0)
			{
				s=(edgenode*)malloc(sizeof(edgenode));
				s->adjvex=i;
				s->next=g->adjlist[j].firsteage;
				g->adjlist[j].firsteage=s;
			}
		}
		fclose(f);
	}
	else
	{
		g->n=0;
	}
}

void dfs(linkedgraph g,int i)
{
	edgenode *p;
	printf("%c ",g.adjlist[i].vertex);
	vis[i]=1;
	p=g.adjlist[i].firsteage;
	while(p)
	{
		if(!vis[p->adjvex])
		{
			dfs(g,p->adjvex);
		}
		p=p->next;
	}
}

void DfsTraverse(linkedgraph g)
{
	int i;
	memset(vis,0,sizeof(vis));
	printf("\nDFS:\n");
	for(i=0;i<g.n;i++)
	{
		if(!vis[i])
		{
			dfs(g,i);
			printf("\n");
		}
	}
	printf("\n");
}

void bfs(linkedgraph g,int i)
{
	int j;
	edgenode *p;
	int queue[M],front ,rear;
	front=0;rear=0;
	printf("%c ",g.adjlist[i].vertex);
	vis[i]=1;
	queue[rear++]=i;
	while(rear>front)
	{
		j=queue[front++];
		p=g.adjlist[j].firsteage;
		while(p)
		{
			if(vis[p->adjvex]==0)
			{
				printf("%c ",g.adjlist[p->adjvex].vertex);
				queue[rear++]=p->adjvex;
				vis[p->adjvex]=1;
			}
			p=p->next;
		}
	}
}

//返回连通分量的个数
int BfsTraverse(linkedgraph g)
{
	printf("BFS:\n");
	int i,count=0;
	memset(vis,0,sizeof(vis));
	for(i=0;i<g.n;i++)
	{
		if(!vis[i])
		{
			count++;
			bfs(g,i);
			printf("\n");
		}
	}
	return count;
}
 
void print(linkedgraph *g)
{
	printf("\n\n输出:\n");
	edgenode *p;
	int i;
	printf("一共有%d个结点,%d条边\n",g->n,g->e);
	for(i=0;i<g->n;i++)
	{
		p=g->adjlist[i].firsteage;
		printf("V%d -> ",i);
		while(p)
		{
			printf("%d",p->adjvex);
			if(p->next)
				printf(" -> ");
			p=p->next;
		}
		printf("\n");
	}
}
 
int main ()
{
	int count;
	linkedgraph g;
	creat(&g,0);
	print(&g);
	DfsTraverse(g);
	count=BfsTraverse(g);
	printf("一共有%d个连通分量\n",count);
	return 0;
}

《【数据结构】图的深度优先遍历 广度优先遍历》      《【数据结构】图的深度优先遍历 广度优先遍历》

 

 

带权无向图的有区别的代码,有向图c=0即可。

typedef struct node /*表结点 或者 边表结点*/
{
	int adjvex;
	int data;
	struct node *next;
}edgenode;

void creat (linkedgraph *g,int c)
{
	int i,j,k,w;
	edgenode *s;
	FILE *f;
	f=fopen("test.txt","r");
	if(f)
	{
		fscanf(f,"%d%d",&g->n,&g->e);
		for(i=0;i<g->n;i++)
		{
			fscanf(f,"%1s",&g->adjlist[i].vertex);
			g->adjlist[i].firsteage=NULL;
		}
		for(k=0;k<g->e;k++)
		{
			fscanf(f,"%d%d%d",&i,&j,&w);
			s=(edgenode*)malloc(sizeof(edgenode));
			s->data=w;
			s->adjvex=j;
			s->next=g->adjlist[i].firsteage;
			g->adjlist[i].firsteage=s;
			if(c==0)
			{
				s=(edgenode*)malloc(sizeof(edgenode));
				s->data=w;
				s->adjvex=i;
				s->next=g->adjlist[j].firsteage;
				g->adjlist[j].firsteage=s;
			}
		}
		fclose(f);
	}
	else
	{
		g->n=0;
	}
}

void print(linkedgraph *g)
{
	printf("\n\n输出:\n");
	edgenode *p;
	int i;
	printf("一共有%d个结点,%d条边\n",g->n,g->e);
	for(i=0;i<g->n;i++)
	{
		p=g->adjlist[i].firsteage;
		printf("V%d -> ",i);
		while(p)
		{
			printf("%d (w = %d)",p->adjvex,p->data);
			if(p->next)
				printf(" -> ");
			p=p->next;
		}
		printf("\n");
	}
}

 

《【数据结构】图的深度优先遍历 广度优先遍历》

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/CSDN___CSDN/article/details/84310265
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞