欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

图的邻接矩阵与邻接表的转换

程序员文章站 2023-12-25 18:22:27
...

图的邻接矩阵与图的邻接表的转换

算法:

#include <iostream>
using namespace std;
#define INFINITY 65535
const int MaxVexNum =10;//顶点的最大个数
typedef char VerTexData;//顶点数据类型
typedef int EdgeData;//边权值的类型
typedef struct
{
        VerTexData VexList1[MaxVexNum];//顶点表
        EdgeData edge[MaxVexNum][MaxVexNum];//邻接矩阵
        int n,e;//图中当前的顶点数和边数
}MTGraph;
typedef struct node//边节点
{
    int dest;//目标节点位置
    EdgeData cost;//边的权值
    struct node *link;//下一边链接指针
}EdgeNode;
typedef struct//顶点结点
{
    VerTexData data;//顶点数据域
    EdgeNode *adj;//边链表头指针
}VerTexNode;
typedef struct//图的邻接表
{
    VerTexNode VexList[MaxVexNum];//邻接表
    int n,e;//图中当前的顶点个数与边数
}AdjGraph;

void CreatGraph1(MTGraph *G)//创建有向图的邻接矩阵
{
        cout<<"创建邻接矩阵\n顶点个数和边个数分别为:\t";
        cin>>G->n>>G->e;
        cout<<"请输入节点信息:\n";
        for(int i=0;i<G->n;i++)
        {

                 cin>>&(G->VexList1[i]);
        }
        for(int i=0;i<G->n;i++)//初始化邻接矩阵
            for(int j=0;j<G->n;j++)
               {
                   if(i==j)G->edge[i][j]=0;
                   else G->edge[i][j]=INFINITY;
               }
        int i,j,w;
        for(int k=0;k<G->e;k++)
        {
             cout<<"输入边(vi,vj)的下标i,下标j和权重w:\t";
             cin>>i>>j>>w;
             G->edge[i][j]=w;
        }
}
void MatrixToList(MTGraph *g, AdjGraph &G)//邻接矩阵转为邻接表
{
    CreatGraph1(g);G.n=g->n;G.e=g->e;
    for(int i=0;i<g->n;i++)
    {
        G.VexList[i].data=g->VexList1[i];
        G.VexList[i].adj=NULL;
    }
    for(int i=0;i<g->n;i++)
    {  
        for(int j=0;j<g->n;j++)
        {
            if((g->edge[i][j]!=0)&&(g->edge[i][j]!=INFINITY))
            {
                EdgeNode *p=new EdgeNode;
                p->dest=j;p->cost=g->edge[i][j];
                p->link=G.VexList[i].adj;
                G.VexList[i].adj=p;
            }
        }
    }
}
void ShowGraph(AdjGraph G)//输出邻接表
{
    cout<<"邻接矩阵转为邻接表运行结果为:\n";
    for(int i=0;i<G.n;i++)
    {
        cout<<G.VexList[i].data;
        EdgeNode *p=G.VexList[i].adj;
        while(p!=NULL)
        {
           cout<<" -> ("<<p->dest<<","<<p->cost<<")";
           p=p->link;
        }
    cout<<"\n";
    }
}
void CreatGraph(AdjGraph &G)//创建邻接表
{
    int tail,head,weight;
    cout<<"创建邻接表\n输入图的顶点数和边数:\t"<<endl;
    cin>>G.n>>G.e;
    cout<<"输入顶点:\n";
    for(int i=0;i<G.n;i++)//输入顶点信息
    {
      cin>>G.VexList[i].data;
       G.VexList[i].adj=NULL;
    }
    cout<<"逐条边输入,分别输入尾,头,权重:\n";
    for(int i=0;i<G.e;i++)
    {
        cin>>tail>>head>>weight;//逐条边输入
        EdgeNode *p=new EdgeNode;
        p->dest=head;p->cost=weight;
        p->link=G.VexList[tail].adj;
        G.VexList[tail].adj=p;
    }
}
void ListToMatrix(AdjGraph &G,MTGraph *g)
{
    CreatGraph(G);G.n=g->n;G.e=g->e;
    for(int i=0;i<g->n;i++)
    {
        g->VexList1[i]=G.VexList[i].data;
        for(int j=0;j<g->e;j++)
        {
            if(i==j) g->edge[i][j]=0;
            else
                 g->edge[i][j]=INFINITY;
        }
    }
    for(int i=0;i<G.n;i++)
    {
        EdgeNode *p=G.VexList[i].adj;
        while(p!=NULL)
        {
            int j=p->dest;
            g->edge[i][j]=p->cost;
            p=p->link;
        }
    }
}
void ShowGraph1(MTGraph G)//输出有向图的邻接矩阵
{
       cout<<"输出图的邻接矩阵为:\n";
        for(int i=0;i<G.n;i++)
        {
                for(int j=0;j<G.n;j++)
                {
                        cout<<G.edge[i][j]<<"\t";
                        if(j==G.n-1) cout<<"\n";
                }
        }
}
int main()
{
    MTGraph g;AdjGraph G;
    MatrixToList(&g,G);
    ShowGraph(G);
    ListToMatrix(G,&g);
    ShowGraph1(g);
    return 0;
}

运行结果:
图的邻接矩阵与邻接表的转换

上一篇:

下一篇: