實現圖的鄰接矩陣和鄰接表的存儲


//graph.h頭文件
typedef int InfoType;
#define MAXV 100//最大頂點個數
//定義鄰接矩陣類型
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;//頂點信息
    ArcNode * firstarc;//指向第一條弧
}VNode;
typedef VNode AdjList[MAXV];//AdjList 是鄰接表類型
typedef struct
{
    AdjList adjlist;//鄰接表
    int n,e;//圖的頂點數n和邊數e
}ALGraph;//圖的鄰接表類型

//相關操作源文件.cpp
#include<iostream>
#include<stdio.h>
#include<malloc.h>
#include"graph.h"
#define INF 32767//INF表示∞
void MatToList(MGraph g,ALGraph * &G)
//將鄰接矩陣g轉換成鄰接表G
{
    int i,j,n=g.n;//n為頂點數
    ArcNode *p;
    G=(ALGraph *)malloc(sizeof(ALGraph));
    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(g.edges[i][j]!=0)//鄰接矩陣的當前元素不為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=n;
            G->e=g.e;
}
void ListToMat(ALGraph *G,MGraph &g)
//將鄰接表G轉換成鄰接矩陣g
{
    int i,j,n=G->n;
    ArcNode *p;
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)//g.edges[i][j]賦初值0
            g.edges[i][j]=0;
        for(i=0;i<n;i++)
        {
            p=G->adjlist[i].firstarc;
            while(p!=NULL)//對所有相鄰的頂點進行處理
            {
                g.edges[i][p->adjvex]=p->info;
                p=p->nextarc;
            }
        }
        g.n=n;
        g.e=G->e;
}
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)
{
    int i;
    ArcNode *p;
    for(i=0;i<G->n;i++)
    {
        p=G->adjlist[i].firstarc;
        if(p!=NULL)
            printf(" %3d: ",i);
        while(p!=NULL)//對所有相鄰的頂點進行處理
        {
            printf(" %3d",p->adjvex);
            p=p->nextarc;
        }
        printf("\n");
    }
}


//主函數源文件.cpp
#include<stdio.h>
#include<malloc.h>
#include"graph.h"
extern void MatToList(MGraph,ALGraph *&);//外部文件中
extern void ListToMat(ALGraph *,MGraph &);
extern void DispMat(MGraph);
extern void DispAdj(ALGraph *);
void main()
{
    int i,j;
    MGraph g,g1;
    ALGraph *G;
    int A[MAXV][6]=
    {
        {0,5,0,7,0,0},
        {0,0,4,0,0,0},
        {8,0,0,0,0,9},
        {0,0,5,0,0,6},
        {0,0,0,5,0,0},
        {3,0,0,0,1,0}
    };
    g.n=6;
    g.e=10;
    for(i=0;i<g.n;i++)//建立圖8.1所示的鄰接矩陣
        for(j=0;j<g.n;j++)
            g.edges[i][j]=A[i][j];
        printf("\n");
        printf(" 有向圖G的鄰接矩陣:\n");
        DispMat(g);
        G=(ALGraph *)malloc(sizeof(ALGraph));
        printf(" 圖G的鄰接矩陣轉換成鄰接表:\n");
        MatToList(g,G);
        DispAdj(G);
        printf(" 圖G的鄰接矩表轉換成鄰接矩陣:\n");
        ListToMat(G,g1);
        DispMat(g1);
        printf("\n");
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM