图
一、使用邻接矩阵存储
#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;
}