zoukankan      html  css  js  c++  java
  • 邻接表的创建及应用

    #include<stdio.h>
    #include<stdlib.h>
    #define MAX 20
    typedef char vextype;
    //
    typedef  struct  node{      //定义边结点的类型
       int adjver;   //边的邻接点的数据(顶点的序号)
       struct  node  *next; //指向本边下一邻接点的指针
    }edgeNode;
    
    //顶点
    typedef  struct {   //定义顶点的类型
       vextype  vertex;     //顶点的数据
       edgeNode  *link;    //指向本边邻接表
    }verNode;
    
    //
    typedef  struct {
       verNode adjlist[MAX];
       int n,e;  //n-顶点数,e-边数
    }link_graph;
    
     //创建无向图
     void CreateGraph(link_graph &g)
     {
         printf("--------------图的创建开始------------
    ");
    
         printf("输入顶点的个数及边的个数:
    ");
    
         scanf("%d%d",&g.n,&g.e);
    
         for(int i=0;i<g.n;i++)
         {
             g.adjlist[i].vertex = (char)(i+65);//顶点赋值
             g.adjlist[i].link = NULL;         //初始化link
         }
    
         printf("输入边值:
    ");
    
         //创建无向图
         for(int i=0;i<g.n;i++)
         {
             int n,m;
             scanf("%d%d",&n,&m);
    
             edgeNode * p = (edgeNode*)malloc(sizeof(edgeNode));
             p->adjver = m;
             p->next = g.adjlist[n].link;
             g.adjlist[n].link = p;
    
             p = (edgeNode*)malloc(sizeof(edgeNode));
             p->adjver = n;
             p->next = g.adjlist[m].link;
             g.adjlist[m].link = p;
    
    
         }
         printf("--------------图的创建结束------------
    ");
     }
    
     void PrintGraph(link_graph g)
     {
         printf("--------------图的输出开始------------
    ");
    
         for(int i=0;i<g.e;i++)
         {
            printf("%2d[%2c]-->[",i,g.adjlist[i].vertex);
            edgeNode * p = g.adjlist[i].link;
            while(p)
            {
                 int j;
                 printf("%2d,",p->adjver);
                 p=p->next;
            }
            printf(" ^ ]
    ");
         }
    
         printf("--------------图的输出结束------------
    
    ");
     }
    int count;
    int visited[MAX];
    void DFS(link_graph g,int v)
    {
        count++;
        visited[v]=1;
        printf("%d ",v);
        edgeNode * p = g.adjlist[v].link;
    
        while(p)
        {
            int j = p->adjver;
            if(!visited[j])
            {
                DFS(g,j);
    
            }
            p = p->next;
        }
    }
    
    //深度优先遍历
    void DFS_AL(link_graph g)
    {
        int num=0;
         for(int i=0;i<g.n;i++)
         {
             visited[i]=0;
         }
    
         for(int i=0;i<g.n;i++)
         {
             count = 0;
             if(!visited[i])
             {
                 DFS(g,i);
                 printf("-->%d
    ",count);//输出每个连通图中的顶点下标
                 num++;
             }
    
         }
         printf("连通图的个数为:%d
    ",num);
    }
    int main()
    {
        link_graph G;
        //创建图
        CreateGraph(G);
        //打印图
        PrintGraph(G);
        //深度优先遍历
        DFS_AL(G);
    
    }

    邻接表的创建及连通子图个数求解

  • 相关阅读:
    最全最详尽的ajax教程1
    Mysql笔记(一)
    JAVA基础知识整理(五)
    JAVA基础知识点整理(四)
    JAVA基础知识点整理(三)
    JAVA基础知识点整理(二)
    JAVA基础知识点整理(一)
    JAVA Web知识点整理(六)
    JAVA Web知识点整理(五)
    JAVA Web知识点整理(四)
  • 原文地址:https://www.cnblogs.com/wwww2/p/11990297.html
Copyright © 2011-2022 走看看