邻接矩阵,邻接链表DFS深度优先搜索C语言

图主要有两种存储结构,邻接矩阵表示法,邻接链表表示法。

以有9个顶点的图为例。如图所示

邻接矩阵表示法

typedef struct {               //邻接矩阵 
	
	elemtype data[9];
	elemtype connect[9][9];
	
}graph,* graphpoint;

建立9个元素的数组用于表示元素
并建立对应关系矩阵用于表示顶点之间的关系

邻接链表表示法

typedef struct node{
	int post;
	struct node *next;
}degree,*degreepoint;

typedef struct graphnode{        //临街链表 
	elemtype gdata;
	degree next;
}graph_list,*listpoint;

建立一个结构体用于表示顶点的度,再建立顶点相关的数组
邻接矩阵DFS
status dfs(graph g,int post)      //邻接矩阵dfs搜索 
{
 int i,j;
 road[post] = 1;
  printf("->%d(%d)",post,g.data[post]);
    for(j = 0;j<9;j++)
    {  
     if(g.connect[post][j] == 1&&j != post&&road[j] != 1)
     {
      dfs(g,j);
  }
 }
 return ok;
}

建立一个结构体外数组road用于储存已经走过的位置,如果位置n走过那么
road[n] = 1

递归调用函数,当出现无路可走时函数退栈回溯至可走位置。
邻接链表DFS
status list_dfs(graph_list g[],int post)             //邻接链表dfs 
{
	int i,j;
	degreepoint m;
	    printf("%d->",post);
	    road[post] = 1;
	    m = g[post].next.next;
	    while(m != NULL)
	    {
		if(road[m->post] == 0)
		{    
		     list_dfs(g,m->post);
	    } 
	    else
	    {
	    	m = m->next;
		}
	}
	return ok;
}

完整代码

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<memory.h> 
#define elemtype int 
#define ok 1
#define fail 0
#define status int 

int road[9];
typedef struct node{
	int post;
	struct node *next;
}degree,*degreepoint;

typedef struct graphnode{        //临街链表 
	elemtype gdata;
	degree next;
}graph_list,*listpoint;

typedef struct {               //邻接矩阵 
	
	elemtype data[9];
	elemtype connect[9][9];
	
}graph,* graphpoint;

status initlist(graph_list g[])    //创建邻接链表 
{
	int i,m;
	listpoint n;
	degreepoint d;
	for(i = 0;i<9;i++)
	{   
	    g[i].next.post = i;
	    d = &(g[i].next) ;
	    printf("enter connect %d\n",i);
		while(scanf("%d",&m))
		{      
		       if(m == -1)
		       {
		       	   d->next = NULL;
		       	   break;
			   }
			   d->next = (degree *)malloc(sizeof(degree));
			   d = d->next;
			   d->post  = m;
		}
		
	}
	return ok;
}

status list_dfs(graph_list g[],int post)             //邻接链表dfs 
{
	int i,j;
	degreepoint m;
	    printf("%d->",post);
	    road[post] = 1;
	    m = g[post].next.next;
	    while(m != NULL)
	    {
		if(road[m->post] == 0)
		{    
		     list_dfs(g,m->post);
	    } 
	    else
	    {
	    	m = m->next;
		}
	}
	return ok;
}

status dfs(graph g,int post)      //邻接矩阵dfs搜索 
{
	int i,j;
	road[post] = 1;
		printf("->%d(%d)",post,g.data[post]);
    for(j = 0;j<9;j++)
    {  
    	if(g.connect[post][j] == 1&&j != post&&road[j] != 1)
    	{
    		dfs(g,j);
		}
	}
	return ok;
}


void initgraph(graphpoint g)   //邻接矩阵图初始化 
{
	int i;
	int j;
	int m;
	
	for(i = 0;i < 9;i++)
	{
		g->data[i] = i+1;
		 
	}
	
	for(i = 0;i<9;i++)
	{
		printf("输入%d关系:",i);
		for(j = 0;j<9;j++)
		{
			scanf("%d",&g->connect[i][j]);
		}
		     
	}
	  }

void showgraph(graph g)        //打印邻接矩阵图 
{
	int i;
	int j;
	printf("图中顶点元素\n\n");
	for(i = 0;i < 9;i++)
	{
		printf("%d ",g.data[i]);
		
	}
	printf("\n\n图中边\n\n");
	
	for(i = 0;i<9;i++)
	{
		for(j = 0;j<9;j++)
		{
			printf("%d ",g.connect[i][j]);
		}
		printf("\n");
	}
	
}

void showlist(graph_list g[])     //打印邻接链表 
{
	int i,j;
	degreepoint m;
	printf("\n\n");
	for(i = 0;i < 9;i++)
	{
		m = &(g[i].next);
		while(m->next != NULL)
		{
			printf("%d->",g[m->post].gdata );
			m = m->next;
		}
		printf("%d\n",g[m->post].gdata );
	}
	printf("\n");
}

int main()
{   int i,j;
	graph g;
	graph_list g1[9] = {{1},{2},{3},{4},{5},{6},{7},{8},{9}};
	for(i = 0;i<9;i++)
	{
			road[i] = 0;
	}
	
	initgraph(&g);
	showgraph(g);
	printf("\n\n");
	dfs(g,4);
	printf("\n\n邻接链表\n\n");
	memset(road,0,sizeof(road));
	initlist(g1);
	showlist(g1);
	list_dfs(g1,4);
	return 0;
}

运行实例 编译器DEV C++

猜你喜欢

转载自blog.csdn.net/jazrynwong/article/details/80555822
今日推荐