⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄

📁 收集的C语言算法程序
💻
字号:
图的深度优先搜索
第一个是邻接表的。

#include<stdio.h>
#define max 12
typedef struct enode{
        int b;
        struct enode *next;
}Edgenode;       //边表 
typedef struct vnode{
        char c;
        Edgenode *first;
}Vertexnode;    //顶点表 
typedef struct graph{
        Vertexnode v[max];
        int n,e;
}Graph;   //图结构 
int visited[max]; //访问标记数组 
void creat(Graph *g) //初始化图 
{
     int i,m,n;
     Edgenode *p; 
     printf("Please input VertexNode:\n");
     for(i=0;i<g->n;i++)
           {
           scanf("\n%c",&g->v[i].c);
           g->v[i].first=NULL;
           }
     for(i=0;i<g->e;i++)
           {
           printf("Please input Edge(like 0,1):\n");
           scanf("\n%d,%d",&m,&n);
           p=(Edgenode *)malloc(sizeof(Edgenode));
           p->b=n;
           p->next=g->v[m].first;
           g->v[m].first=p;
           
           p=(Edgenode *)malloc(sizeof(Edgenode));
           p->b=m;
           p->next=g->v[n].first;
           g->v[n].first=p;           
           }
}

void dsearch(Graph *g,int i) //从边表开始递归搜索 
{
     Edgenode *p;
     printf("%c ",g->v[i].c); //访问 
     visited[i]=1;
     p=g->v[i].first;
     while(p)              //当有边表节点时 
     {       if(visited[p->b]!=1)   //如果边表内的下标处的顶点未被访问 
                  dsearch(g,p->b); //递归搜索 
             p=p->next;            //否则查找边表的下一个节点 
     }
}
     
void dfs(Graph *g)
{
     int i;
     for(i=0;i<g->n;i++)
          visited[i]=0;
     for(i=0;i<g->n;i++)          //从标记数组一个一个查起 
           if(visited[i]==0)
                  dsearch(g,i);
        
}           
int main()
{
    Graph *g;
    g=(Graph *)malloc(sizeof(Graph));
    g->n=4;g->e=5; //表的顶点个数和边的个数 
    creat(g);
    dfs(g);
    system("pause");
}


第二个是邻接矩阵的。

#include<stdio.h>
#define max 20
typedef struct graph{
        char v[max];
        int edge[max][max];
        int n,e;
}Graph;
int visited[max];
void creatg(Graph *g)
{
int i,j,m,n,w=1;
g->n=8;g->e=9;
printf("Please input Vertex:\n");
for(i=0;i<g->n;i++)
        scanf("\n%c",&g->v[i]);
printf("Please input Edge:\n");
for(i=0;i<g->n;i++)
     for(j=0;j<g->n;j++)
          g->edge[i][j]=0;
for(i=0;i<g->e;i++)
          {
          scanf("\n%d,%d",&m,&n);
          g->edge[m][n]=w;
          g->edge[n][m]=w;
          }
}

void search(Graph *g,int i)
{    
     int j;
     printf("%c ",g->v[i]);
     visited[i]=1;
     for(j=0;j<g->n;j++)
          if(g->edge[i][j]==1 && visited[j]!=1) //若邻接点存在且未被访问过 
          //为什么不是visited[g->edge[i][j]],这是和邻接表不一样的。
          //邻接矩阵只用了下标,矩阵里面存的是权 
                   search(g,j);
}

void dfs(Graph *g)
{
     int i,j;
     for(i=0;i<g->n;i++)
         visited[i]=0;
     for(i=0;i<g->n;i++)
         if(visited[i]!=1)
               search(g,i); 
}

int main()
{
Graph *g;
g=(Graph *)malloc(sizeof(Graph));
creatg(g);
dfs(g);
system("pause");
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -