图的存储结构实现

源文件:

#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.初始化函数测试:\n");
    initial(g);
    printf("2.创建函数测试:\n");
    create(g);
    printf("3.输出函数测试:\n");
    printg(g);
    printf("4.输出顶点度函数测试:\n");
    degree(g);
    printf("5.深度优先遍历函数测试:\n");
    dfstraverse(g);
    printf("6.广度优先遍历函数测试:\n");
    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("请输入弧的信息,格式:弧尾,弧头\n");
    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("输入图的邻接矩阵存储信息:\n");
    printf("顶点数据:\n");
    for(i=0;i<g.n;i++)
        printf("%d:%c\n",i,g.vexes[i]);
    printf("邻接矩阵数据:\n");
    for(i=0;i<g.n;i++)
    {
        for(j=0;j<g.n;j++)
        {
            printf("%3d",g.edges[i][j]);
        }
        printf("\n");
    }
}
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\n",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);
}
posted @ 2019-10-23 16:53  如梦山河乀  阅读(365)  评论(0编辑  收藏  举报