C语言(邻接矩阵,邻接表实现dfs,bfs)

dfs
1.邻接矩阵
#include<stdio.h>
#include<string.h>
#define MVNum 10                //最大顶点数 
typedef struct{ 
  	char vexs[MVNum];           //顶点表 
  	int arcs[MVNum][MVNum];     //邻接矩阵 
  	int vexnum,arcnum;  
}AMGraph; 

int visited[MVNum];

void create(AMGraph &g);
void dfs(AMGraph &g, int v);

int main(){
	AMGraph g;
	create(g);
	memset(visited, 0, sizeof(visited));
	dfs(g, 0);
	printf("\n");	
}
void create(AMGraph &g){
	int n,m;
	scanf("%d %d",&n,&m);getchar();
	g.vexnum=n;g.arcnum=m;
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			g.arcs[i][j]=0;

	for(int i=0;i<n;i++){
		g.vexs[i]=getchar();
		getchar();
	}
	int tx,ty;
	for(int i=0;i<m;i++){char tc1,tc2;
		scanf("%c %c",&tc1,&tc2);getchar();
		for(int j=0;j<n;j++){
			if(tc1==g.vexs[j])
				tx=j;
			if(tc2==g.vexs[j])
				ty=j;
		}
		g.arcs[tx][ty]=1;
		g.arcs[ty][tx]=1;
	}
}

void dfs(AMGraph &g, int v){
	printf("%c ",g.vexs[v]);
	visited[v]=1;
	for(int o=0;o<g.vexnum;o++){
		if(g.arcs[v][o]==1&&visited[o]==0)//有边且未递归到此节点 
			dfs(g,o);
	}
	
}

2.邻接表
include<stdio.h>
#include<string.h>
#define MVNum 10

typedef struct ArcNode {
       int adjvex;		// 顶点下标 
       struct ArcNode *nextarc;  // 指向下一条边的指针
}ArcNode;	 // 顶点信息

typedef struct { 	
       char data; 	// 数据域,存放数据 
       ArcNode *firstarc;   // 指向第一条边的指针 
}VNode;	  // 表头结点 

typedef struct 	
{     VNode vexs[MVNum];	// 顶点数组(表头结点组成的数组) 
      int vexnum, arcnum; 	  
}ALGraph; 

int visited[MVNum];

void create(ALGraph &g); // 邻接表中的表结点采用头插法
void dfs(ALGraph &g, int v);
int main(){
	ALGraph g;
	create(g);
	memset(visited, 0, sizeof(visited));
	dfs(g, 0);
	printf("\n");
}
void create(ALGraph &g){
	int n,m;
	scanf("%d %d",&n,&m);getchar();
	g.vexnum=n;g.arcnum=m;
	for(int i=0;i<n;i++){
		scanf("%c",&g.vexs[i].data);
		getchar();
		g.vexs[i].firstarc = NULL;
	}
	for(int o=0;o<m;o++){
		char u,v;
		scanf("%c",&u);getchar();
		scanf("%c",&v);getchar();
		int i,j;
		for(int k=0;k<n;k++){
			if(u==g.vexs[k].data)
				i=k;
			if(v==g.vexs[k].data)
				j=k;
		}
		
		ArcNode *pu,*pv;
		pu = new ArcNode;
		pu->adjvex=i;
		pu->nextarc = g.vexs[j].firstarc;
		g.vexs[j].firstarc=pu;
		pv = new ArcNode;
		pv->nextarc = g.vexs[i].firstarc;
		pv->adjvex=j;
		g.vexs[i].firstarc=pv;
	}
}
void dfs(ALGraph &g, int v){//v为顶点数组的下标 
	printf("%c ",g.vexs[v].data);
	visited[v]=1;
	ArcNode *p = g.vexs[v].firstarc;
	while(p){
		if(visited[p->adjvex]==0)//有边且未递归到此节点 
			dfs(g,p->adjvex);
		p=p->nextarc;
	}
}


bfs
1.
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;

#define MVNum 10                //最大顶点数 
typedef struct{ 
  	char vexs[MVNum];      //顶点表 
  	int arcs[MVNum][MVNum];     //邻接矩阵 
  	int vexnum,arcnum;  
}AMGraph; 

int visited[MVNum];

void create(AMGraph &g);

void bfs(AMGraph &g, int v);

int main(){
	AMGraph g;
	create(g);
	memset(visited, 0, sizeof(visited));
	bfs(g, 0);	
}
void create(AMGraph &g){
	int n,m;
	scanf("%d %d",&n,&m);getchar();
	g.vexnum=n;g.arcnum=m;
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			g.arcs[i][j]=0;
	for(int i=0;i<n;i++){
		g.vexs[i]=getchar();
		getchar();
	}
	int tx,ty;
	for(int i=0;i<m;i++){char tc1,tc2;
		scanf("%c %c",&tc1,&tc2);getchar();
		for(int j=0;j<n;j++){
			if(tc1==g.vexs[j])
				tx=j;
			if(tc2==g.vexs[j])
				ty=j;
		}
		g.arcs[tx][ty]=1;
		g.arcs[ty][tx]=1;
	}
}

void bfs(AMGraph &g, int v){
	queue<int> q;
	printf("%c ",g.vexs[v]);
	visited[v]=1;//当第一个则=1 
	q.push(v);
	while(!q.empty()){
		int u = q.front();
		q.pop();
		for(int i=0;i<g.vexnum;i++){
			if(visited[i]==0&&g.arcs[u][i]==1){//如果邻接且未当过头 
				printf("%c ",g.vexs[i]);
				visited[i]=1;
				q.push(i);
			}
		}
	}
}

2.
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#define MVNum 10

typedef struct ArcNode {
       int adjvex;		// 位置(下标) 
       struct ArcNode *nextarc;  // 指向下一条边的指针
}ArcNode;	 //顶点信息(普通节点) 

typedef struct { 	
       char data; 	// 数据域,存放数据
       ArcNode *firstarc;   // 指向第一条边的指针 
}VNode;	  // 表头结点 

typedef struct 	
{     VNode vexs[MVNum];	// 顶点数组(表头结点组成的数组)
      int vexnum, arcnum; 	  
}ALGraph; 

int visited[MVNum];

void create(ALGraph &g); // 邻接表中的表结点采用头插法
void bfs(ALGraph &g, int v);

int main(){
	ALGraph g;
	create(g);
	memset(visited, 0, sizeof(visited));
	bfs(g, 0);
}

void create(ALGraph &g){
	int n,m;
	scanf("%d %d",&n,&m);getchar();
	g.vexnum=n;g.arcnum=m;
	for(int i=0;i<n;i++){
		scanf("%c",&g.vexs[i].data);
		getchar();
		g.vexs[i].firstarc = NULL;
	}
	for(int o=0;o<m;o++){
		char u,v;
		scanf("%c",&u);getchar();
		scanf("%c",&v);getchar();
		//找到输入的两边的下标 i,j 
		int i,j;
		for(int k=0;k<n;k++){
			if(u==g.vexs[k].data)
				i=k;
			if(v==g.vexs[k].data)
				j=k;
		}
		ArcNode *pu,*pv;
		pu = new ArcNode;
		pu->adjvex=i;
		pu->nextarc = g.vexs[j].firstarc;//插入到另一个的头节点后面 
		g.vexs[j].firstarc=pu;			//同上 
		pv = new ArcNode; 
		pv->nextarc = g.vexs[i].firstarc;
		pv->adjvex=j;
		g.vexs[i].firstarc=pv;
	}
}
 
void bfs(ALGraph &g, int v){
	int w;
	queue <int> q;
	q.push(v);//入队 
	visited[v]=1;
	while(!q.empty()){//此循环寻找遍历/寻找 刚出队的点 的(所有)连接点 
		w = q.front();
		q.pop();//出队便打印
		printf("%c ",g.vexs[w].data);
		//p为临时指针用于遍历/寻找 刚出队的点 的连接点 
		ArcNode *p = g.vexs[w].firstarc;
		while(p){
			if(visited[p->adjvex]==0){//判断该点是否已入队(入队过),若否 则入队,并在visited记录
				q.push(p->adjvex);	
				visited[p->adjvex]=1;
			}
			p=p->nextarc;
		}
	}
}



  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值