C语言实现图

本文介绍了如何用C语言定义图的数据结构,包括邻接矩阵的使用,以及深度优先搜索(DFS)和广度优先搜索(BFS)算法的实现,通过示例展示了如何创建图并操作其数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、使用邻接矩阵存储

#define N 5
typedef int datatype;
typedef struct{
	datatype vertex[N];
	int marix[N][N];

}grapht;

1、创建图

grapht *create_grapht(){
grapht *g=NULL;
g=(grapht *)malloc(sizeof(grapht));
memset(g,0,sizeof(grapht));
for(int i=0;i<N;i++){
g->vertex[i]=i;
}


}

2、输入图中的数据

void input_data(grapht *g){
printf("please input like (v0,v1) (v0,v2)...\n");
int i=0,j=0;
while(scanf("(v%d,v%d)",&i,&j)==2){
g->marix[i][j]=1;
getchar();//为了读取(v0,v1) 后面的空格
}
while(getchar()!='\n');//读到换行结束
return ;
}

3、输出图中的数据

void output_data(grapht *g){
printf("%3c",' ');
for(int i=0;i<N;i++){
printf("V%d ",i);
}
putchar('\n');
for(int i=0;i<N;i++){
printf("V%-2d",i);

for(int j=0;j<N;j++){
printf("%-3d",g->marix[i][j]);
}
putchar('\n');

}


}

输入

(v0,v1) (v0,v2) (v0,v3) (v1,v2) (v1,v4) (v2,v3) (v3,v4)

输出:

在这里插入图片描述

4、深度优先遍历算法

int visited[N];//0表示未访问,1表示已访问

//找到v的第一个邻接点
datatype first_adj(grapht *g,datatype v){
	for(int i=0;i<N;i++){
	
	if(g->marix[v][i]!=0){
	return i;
	}
	}
return -1;
}
//找到v的下一个邻接点
datatype next_adj(grapht *g,datatype v,datatype u){
for(int  i=u+1;i<N;i++){
if(g->marix[v][i]!=0){
return i;
}
}
return -1;

}



void DFS(grapht *g,datatype v){
	printf("V%d ",v);
	visited[v]=1;
    datatype u=first_adj(g,v);
	while(u!=-1){
     	if(visited[u]==0){
		DFS(g,u);
		}
		u=next_adj(g,v,u);
	}

}



5、广度优先深度算法

需要创建队列

void BFS(grapht *g,datatype v){
 link_queue *queue=create_link_queue();

 visited[v]=1;
 in_queue(queue,v);
data_type u=0;
 while(!is_empty(queue)){
	u=out_queue(queue);
    printf("V%d ",u);
	
	for(int i=0;i<N;i++){
		if(g->marix[u][i]==1&&visited[i]==0){
			visited[i]=1;
			in_queue(queue,i);
		}
	}

 }
return;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值