【第十一周项目2】操作用邻接表存储的图

来源:互联网 发布:软件就业前景 编辑:程序博客网 时间:2024/06/05 06:09
/*  Copyright (c)2017,烟台大学计算机与控制工程学院  All rights reserved.  文件名称:第十二周项目2 - 操作用邻接表存储的图.cpp  作    者:swz  完成日期:2017年11月16日     问题描述: 实现图遍历算法,分别输出如下图结构的深度优先(DFS)遍历序列和广度优先遍历(BFS)序列。   输入描述:若干测试数据。  程序输出:DFS,BFS的遍历序列。   */      (1)头文件:      #ifndef GRAPH_H_INCLUDED    #define GRAPH_H_INCLUDED    #include <stdio.h>    #include <malloc.h>    #define MAXV 100                //最大顶点个数    #define INF 32767       //INF表示∞    typedef int InfoType;        //以下定义邻接矩阵类型    typedef struct    {        int no;                     //顶点编号        InfoType info;              //顶点其他信息,在此存放带权图权值    } VertexType;                   //顶点类型        typedef struct                  //图的定义    {        int edges[MAXV][MAXV];      //邻接矩阵        int n,e;                    //顶点数,弧数        VertexType vexs[MAXV];      //存放顶点信息    } MGraph;                       //图的邻接矩阵类型        //以下定义邻接表类型    typedef struct ANode            //弧的结点结构类型    {        int adjvex;                 //该弧的终点位置        struct ANode *nextarc;      //指向下一条弧的指针        InfoType info;              //该弧的相关信息,这里用于存放权值    } ArcNode;        typedef int Vertex;        typedef struct Vnode            //邻接表头结点的类型    {        Vertex data;                //顶点信息        int count;                  //存放顶点入度,只在拓扑排序中用        ArcNode *firstarc;          //指向第一条弧    } VNode;        typedef VNode AdjList[MAXV];    //AdjList是邻接表类型        typedef struct    {        AdjList adjlist;            //邻接表        int n,e;                    //图中顶点数n和边数e    } ALGraph;                      //图的邻接表类型        //功能:由一个反映图中顶点邻接关系的二维数组,构造出用邻接矩阵存储的图    //参数:Arr - 数组名,由于形式参数为二维数组时必须给出每行的元素个数,在此将参数Arr声明为一维数组名(指向int的指针)    //      n - 矩阵的阶数    //      g - 要构造出来的邻接矩阵数据结构    void ArrayToMat(int *Arr, int n, MGraph &g); //用普通数组构造图的邻接矩阵    void ArrayToList(int *Arr, int n, ALGraph *&); //用普通数组构造图的邻接表    void MatToList(MGraph g,ALGraph *&G);//将邻接矩阵g转换成邻接表G    void ListToMat(ALGraph *G,MGraph &g);//将邻接表G转换成邻接矩阵g    void DispMat(MGraph g);//输出邻接矩阵g    void DispAdj(ALGraph *G);//输出邻接表G    void OutDs(ALGraph *G);    void OutMaxDs(ALGraph *G);    void ZeroDs(ALGraph *G);    bool Arc(ALGraph *G, int i,int j);    #endif // GRAPH_H_INCLUDED            (2)main 函数  #include"head.h"    int main()    {        ALGraph *G;        int A[7][7]=        {            {0,1,1,1,0,0,0},            {0,0,0,0,1,0,0},            {0,0,0,0,1,1,0},            {0,0,0,0,0,0,1},            {0,0,0,0,0,0,0},            {0,0,0,1,1,0,1},            {0,1,0,0,0,0,0}        };        ArrayToList(A[0], 7, G);        printf("(1)各顶点出度:\n");        OutDs(G);        printf("(2)最大出度的顶点信息:");        OutMaxDs(G);        printf("(3)出度为0的顶点:");        ZeroDs(G);        printf("(4)边<2,6>存在吗?");        if(Arc(G,2,6))            printf("是\n");        else            printf("否\n");        printf("\n");        return 0;    }        (3)源文件    #include "head.h"        //功能:由一个反映图中顶点邻接关系的二维数组,构造出用邻接矩阵存储的图    //参数:Arr - 数组名,由于形式参数为二维数组时必须给出每行的元素个数,在此将参数Arr声明为一维数组名(指向int的指针)    //      n - 矩阵的阶数    //      g - 要构造出来的邻接矩阵数据结构    void ArrayToMat(int *Arr, int n, MGraph &g)    {        int i,j,count=0;  //count用于统计边数,即矩阵中非0元素个数        g.n=n;        for (i=0; i<g.n; i++)            for (j=0; j<g.n; j++)            {                g.edges[i][j]=Arr[i*n+j]; //将Arr看作n×n的二维数组,Arr[i*n+j]即是Arr[i][j],计算存储位置的功夫在此应用                if(g.edges[i][j]!=0 && g.edges[i][j]!=INF)                    count++;            }        g.e=count;    }        void ArrayToList(int *Arr, int n, ALGraph *&G)    {        int i,j,count=0;  //count用于统计边数,即矩阵中非0元素个数        ArcNode *p;        G=(ALGraph *)malloc(sizeof(ALGraph));        G->n=n;        for (i=0; i<n; i++)                 //给邻接表中所有头节点的指针域置初值            G->adjlist[i].firstarc=NULL;        for (i=0; i<n; i++)                 //检查邻接矩阵中每个元素            for (j=n-1; j>=0; j--)                if (Arr[i*n+j]!=0)      //存在一条边,将Arr看作n×n的二维数组,Arr[i*n+j]即是Arr[i][j]                {                    p=(ArcNode *)malloc(sizeof(ArcNode));   //创建一个节点*p                    p->adjvex=j;                    p->info=Arr[i*n+j];                    p->nextarc=G->adjlist[i].firstarc;      //采用头插法插入*p                    G->adjlist[i].firstarc=p;                }            G->e=count;    }        void MatToList(MGraph g, ALGraph *&G)    //将邻接矩阵g转换成邻接表G    {        int i,j;        ArcNode *p;        G=(ALGraph *)malloc(sizeof(ALGraph));        for (i=0; i<g.n; i++)                   //给邻接表中所有头节点的指针域置初值            G->adjlist[i].firstarc=NULL;        for (i=0; i<g.n; i++)                   //检查邻接矩阵中每个元素            for (j=g.n-1; j>=0; j--)                if (g.edges[i][j]!=0)       //存在一条边                {                    p=(ArcNode *)malloc(sizeof(ArcNode));   //创建一个节点*p                    p->adjvex=j;                    p->info=g.edges[i][j];                    p->nextarc=G->adjlist[i].firstarc;      //采用头插法插入*p                    G->adjlist[i].firstarc=p;                }        G->n=g.n;        G->e=g.e;    }        void ListToMat(ALGraph *G,MGraph &g)    //将邻接表G转换成邻接矩阵g    {        int i,j;        ArcNode *p;        g.n=G->n;   //根据一楼同学“举报”改的。g.n未赋值,下面的初始化不起作用        g.e=G->e;        for (i=0; i<g.n; i++)   //先初始化邻接矩阵            for (j=0; j<g.n; j++)                g.edges[i][j]=0;        for (i=0; i<G->n; i++)  //根据邻接表,为邻接矩阵赋值        {            p=G->adjlist[i].firstarc;            while (p!=NULL)            {                g.edges[i][p->adjvex]=p->info;                p=p->nextarc;            }        }    }        void DispMat(MGraph g)    //输出邻接矩阵g    {        int i,j;        for (i=0; i<g.n; i++)        {            for (j=0; j<g.n; j++)                if (g.edges[i][j]==INF)                    printf("%3s","∞");                else                    printf("%3d",g.edges[i][j]);            printf("\n");        }    }        void DispAdj(ALGraph *G)    //输出邻接表G    {        int i;        ArcNode *p;        for (i=0; i<G->n; i++)        {            p=G->adjlist[i].firstarc;            printf("%3d: ",i);            while (p!=NULL)            {                printf("-->%d/%d ",p->adjvex,p->info);                p=p->nextarc;            }            printf("\n");        }    }    int OutDegree(ALGraph *G,int v)    {        ArcNode *p;        int n=0;        p=G->adjlist[v].firstarc;        while (p!=NULL)        {            n++;            p=p->nextarc;        }        return n;    }                //输出图G中每个顶点的出度    void OutDs(ALGraph *G)    {        int i;        for (i=0; i<G->n; i++)            printf("  顶点%d:%d\n",i,OutDegree(G,i));    }        //输出图G中出度最大的一个顶点    void OutMaxDs(ALGraph *G)    {        int maxv=0,maxds=0,i,x;        for (i=0; i<G->n; i++)        {            x=OutDegree(G,i);            if (x>maxds)            {                maxds=x;                maxv=i;            }        }        printf("顶点%d,出度=%d\n",maxv,maxds);    }    //输出图G中出度为0的顶点数    void ZeroDs(ALGraph *G)    {        int i,x;        for (i=0; i<G->n; i++)        {            x=OutDegree(G,i);            if (x==0)                printf("%2d",i);        }        printf("\n");    }        //返回图G中是否存在边<i,j>    bool Arc(ALGraph *G, int i,int j)    {        ArcNode *p;        bool found = false;        p=G->adjlist[i].firstarc;        while (p!=NULL)        {            if(p->adjvex==j)            {                found = true;                break;            }            p=p->nextarc;        }        return found;    }    




阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信头像没有了怎么办 科二超过5次怎么办 蘑菇街个人中心打不开怎么办 蘑菇街的个人中心打不开怎么办 qq群500人满了怎么办 微信零钱发不出来怎么办 微信零钱发不出去怎么办 微信零钱发不了红包怎么办 当亲戚孤立你该怎么办 陌陌好友找不到了怎么办 换了手机号陌陌号找不到怎么办 微信解析包出现问题怎么办 老板找借口不发工资怎么办 苹果手机忘记id帐号密码怎么办 苹果6手机帐号密码忘记怎么办 狗狗在窝里撒尿怎么办 爸妈和媳妇不好怎么办 如果老婆不用老公的钱怎么办 老公不给老婆钱花怎么办 奶少孩子不愿意吸怎么办 孩子识字少不愿意读书怎么办 夏天孩子不愿意喝水尿量少黄怎么办 孩子不喜欢与别人沟通怎么办 异地恋他爸妈不同意怎么办 刚装修家里很臭怎么办 狗弄得家里很臭怎么办 抑郁症患者不愿意回家见家人怎么办 属猴的人养猫怎么办 对方电话拉黑我怎么办 手机号码换了淘宝账号怎么办 扣扣号有密码无法加好友怎么办 扣扣帐号忘记了怎么办 扣扣帐号被冻结怎么办 xp忘了开机密码怎么办 手机怎样知道好友qq密码怎么办 找回微信密码申诉失败怎么办 若微信号被盗钱怎么办 微信号被倒了怎么办 微信支付密码忘了怎么办 微信钱包密码忘了怎么办 忘记qq锁屏密码怎么办