zoukankan      html  css  js  c++  java
  • 图的存储结构实现

    源文件:

    #include <stdio.h>
    #include <stdlib.h>
    #define maxv 10
    #define max 10
    typedef char elem;
    typedef int elemtype;
    #include "queue.h"
    #include "mgraph.h"
    void main()
    {
        mgraph g;
        printf("1.初始化函数测试:
    ");
        initial(g);
        printf("2.创建函数测试:
    ");
        create(g);
        printf("3.输出函数测试:
    ");
        printg(g);
        printf("4.输出顶点度函数测试:
    ");
        degree(g);
        printf("5.深度优先遍历函数测试:
    ");
        dfstraverse(g);
        printf("6.广度优先遍历函数测试:
    ");
        bfs(g);
    }
    

    头文件:

    //有向图的邻接矩阵,顶点数据为字符型
    typedef struct MGraph
    {
        elem vexes[maxv];//顶点表
        int edges[maxv][maxv];//邻接矩阵
        int n,e;//顶点数n和边数e
    }mgraph;
    bool visited[maxv];//访问标志数组
    void initial(mgraph &g)//初始化函数
    {
        int i,j;
        g.e=0;
        g.n=0;
        for(j=0;j<maxv;j++)
            g.vexes[j]=0;//建立顶点表
        for(i=0;i<maxv;i++)
        {
            for(j=0;j<maxv;j++)
            {
                g.edges[i][j]=0;//初始化邻接矩阵
            }
        }
    }
    int locate(mgraph g,elem u)//查找顶点对应的数组下标值
    {
        for(int i=0;i<g.n;i++)
        {
            if(g.vexes[i]==u)
                return i;
        }
        return -1;
    }
    void create(mgraph &g)//创建图的邻接矩阵存储
    {
        int i,j,k;
        elem u,v;
        printf("请输入有向图的顶点数:");
        scanf("%d",&g.n);
        printf("请输入有向图的弧数:");
        scanf("%d",&g.e);
        fflush(stdin);//清空缓存中的数据
        printf("请输入字符型顶点数据,如ABCD:");
        for(j=0;j<g.n;j++)
            scanf("%c",&g.vexes[j]);//建立顶点表
        fflush(stdin);
        printf("请输入弧的信息,格式:弧尾,弧头
    ");
        for(k=0;k<g.e;k++)
        {
            scanf("%c,%c",&u,&v);
            i=locate(g,u);
            j=locate(g,v);
            g.edges[i][j]=1;
            fflush(stdin);
        }
    }
    void printg(mgraph g)//输出有向图的邻接矩阵
    {
        int i,j;
        printf("输入图的邻接矩阵存储信息:
    ");
        printf("顶点数据:
    ");
        for(i=0;i<g.n;i++)
            printf("%d:%c
    ",i,g.vexes[i]);
        printf("邻接矩阵数据:
    ");
        for(i=0;i<g.n;i++)
        {
            for(j=0;j<g.n;j++)
            {
                printf("%3d",g.edges[i][j]);
            }
            printf("
    ");
        }
    }
    void degree(mgraph g)//输出顶点的度
    {
        int i,j,in,out;
        for(i=0;i<g.n;i++)
        {
            in=0;
            out=0;
            for(j=0;j<g.n;j++)
            {
                if(g.edges[i][j]!=0)
                    out++;
                if(g.edges[j][i]!=0)
                    in++;
            }
            printf("顶点%c的出度为%d---入度为%d---度为%d
    ",g.vexes[i],out,in,in+out);
        }
    }
    int firstadjvex(mgraph g,int v)//顶点v的第一个邻接顶点
    {
        for(int i=0;i<g.n;i++)
        {
            if(g.edges[v][i]==1)
                return i;
        }
        return -1;
    }
    int nextadjvex(mgraph g,int v,int w)//顶点v的相对于w的下一个邻接顶点
    {
        for(int i=w+1;i<g.n;i++)
        {
            if(g.edges[v][i]==1)
                return i;
        }
        return -1;
    }
    void dfs(mgraph g,int v)//遍历一个连通分量
    {
        int w;
        visited[v]=true;
        printf("%c ",g.vexes[v]);
        for(w=firstadjvex(g,v);w>=0;w=nextadjvex(g,v,w))
        {
            if(!visited[w])
                dfs(g,w);
        }
    }
    void dfstraverse(mgraph g)//深度优先遍历
    {
        int v;
        for(v=0;v<g.n;v++)
            visited[v]=false;//标志访问数组初始化
        for(v=0;v<g.n;v++)
        {
            if(!visited[v])
                dfs(g,v);
        }
    }
    void bfs(mgraph g)//广度优先遍历
    {
        int u=0,v=0,w=0;
        queue q;
        for(v=0;v<g.n;v++)
            visited[v]=false;
        initqueue(q);
        for(v=0;v<g.n;v++)
        {
            if(!visited[v])
            {
                visited[v]=true;
                printf("%c ",g.vexes[v]);
                enqueue(q,v);
                while(!queueempty(q))
                {
                    dequeue(q,u);
                    for(w=firstadjvex(g,u);w>=0;w=nextadjvex(g,u,w))
                    {
                        if(!visited[w])
                        {
                            visited[w]=true;
                            printf("%c ",g.vexes[w]);
                            enqueue(q,w);
                        }
                    }
                }
            }
        }
        destroyqueue(q);
    }
    
  • 相关阅读:
    Spark SQL ---一般有用
    idea快捷键
    04.Scala编程实战 ---没看
    03.Scala高级特性 ---没看
    02.Actor编程 ---没看
    01.Scala编程基础 ---没看
    附6、Storm面试题目答疑 ---一般有用
    扩展运算符
    ES6新增数组方法(部分)
    for of 循环
  • 原文地址:https://www.cnblogs.com/yonglin1998/p/11780792.html
Copyright © 2011-2022 走看看