zoukankan      html  css  js  c++  java
  • 图的邻接表表示及其遍历

    图的邻接表表示及其遍历

    1.图的结构定义

    #define MAXVEX 100
    #define true 1
    typedef char VertexType;		//定义图节点值得类型,可随意更换
    typedef int EdgeType;			
    typedef struct EdgeNode  		//定义边表节点
    {
    	int adjvex;              	//存储顶点下标
     	EdgeType weight;            //权重值
    	struct EdgeNode* next;      //边指针
    }EdgeNode;
    typedef struct VertexNode	/*顶点表节点*/
    {
    	VertexType data;
    	EdgeNode* firstedge;
    }VertexNode,AdjList[MAXVEX];
    typedef struct
    {
    	AdjList adjList;
    	int numVertexes,numEdges;
    }GraphAdjList;
    
    

    2.图的建立

    void CreatGraph(GraphAdjList *g)
    {
    	int i,j,k;
    	EdgeNode *e;
    	scanf("%d%d",&g->numVertexes,&g->numEdges);//获取顶点数和边数
    	char c;
    	//gettchar();
    	for(i=0;i<g->numVertexes;i++)
    	{
    		while((c=getchar())=='
    '||c==' ');//排除空格和换行符
    		g->adjList[i].data = c;            //获取顶点值,
    		g->adjList[i].firstedge = NULL;    //将边表置为空
    	}
    	for(k=0;k<g->numEdges;k++)
    	{
    		scanf("%d%d",&i,&j);               //输入i,j 在图中有i-->j
    		e=(EdgeNode*)malloc(sizeof(EdgeNode));
    		e->adjvex = j;
    		e->next = g->adjList[i].firstedge;   //头插法建立边表
    		g->adjList[i].firstedge= e;
    		/*如果为无向图,则加入以下代码
                    e=(EdgeNode*)malloc(sizeof(EdgeNode));
                    e->adjvex = i;
                    e->next = g->adjList[j].firstedge;
                    g->adjList[j].firstedge= e;*/
       	}
    }
    

    3.图的DFS遍历

    void DFS(GraphAdjList *g,int i)
    {
            EdgeNode *p;
            visited[i]=true;
            printf("%c ",g->adjList[i].data);
            p = g->adjList[i].firstedge;
            while(p)
            {
                    if(visited[p->adjvex]==0)
                            DFS(g,p->adjvex);
                    p=p->next;
            }
    }
    

    假设有下面这张图,这个图包含两个连通图。

    这里写图片描述
    输入如下:

    7 6           		 <==输入顶点数和边数
    a b c d e f g        <==输入顶点值
    0 2 0 3 0 1 4 5 1 6 1 2        <==依次输入边
     
    

    根据输入,可以得到邻接表如下:
    这里写图片描述
    根据邻接表可知,该图的深度优先遍历如下:

    a->b->c->g->d->e->f
    

    程序运行结果:
    这里写图片描述
    证明程序是正确的。
    完整程序代码参见:
    https://github.com/zkangHUST/DataStructure

  • 相关阅读:
    第八章 数据库连接JDBC(待续)
    Linux下chkconfig命令详解
    在Debian上用Bind 配置DNS服务器
    【故障处理】mysql出现大量slave bin日志,将磁盘空间占满
    Debian 配置apt-get源
    Debian Vi 简介
    SaltStack之Master配置文件详解
    AUTOSSH,ssh反向代理
    yum简单安装salt master与minion
    salt安装与简单使用---基于centos6.5
  • 原文地址:https://www.cnblogs.com/zhengkang/p/5750340.html
Copyright © 2011-2022 走看看