数据结构(11):图的存储方式(邻接矩阵、邻接表....)

/*     邻接矩阵     */
#include 
using namespace std;

#define MAXVEX 100                  // 最大顶点数     (用户自定义) 
#define INFINITY 65535              // 用66535来代表 '无穷大' 
typedef char VertexType;            // 顶点类型       (用户自定义) 
typedef int EdgeType;               // 边上的权值类型 (用户自定义) 

// 邻接矩阵存储的结构
typedef struct
{
    VertexType vexs[MAXVEX];        // 顶点表 
    EdgeType arc[MAXVEX][MAXVEX];   // 邻接矩阵 
    int numVertexes, numEdges;      // 当前图中的顶点数以及边数 
} MGraph;

/* 建立无向网图的邻接矩阵表示 */
void CreateMGraph(MGraph *G)
{
    int i,j,k,w;
    cout<<"输入顶点数和边数:";
    cin>>G->numVertexes>>G->numEdges;

                                        // 输入各顶点信息 
    for(i=0; inumVertexes; i++)
        cin>>G->vexs[i];

                                        // 初始化邻接矩阵 
    for(i=0; inumVertexes; i++)
        for(j=0; jnumVertexes; j++)
            G->arc[i][j] = INFINITY;
                                        // 读入各边信息 
    for(k=0; knumEdges; k++)        
    {
        cout<<"输入边(vi,vj)上的下标i 和下标j 以及边上的权值w:";
        cin>>i>>j>>w;

        G->arc[i][j] = w;
        G->arc[j][i] = G->arc[i][j];    // 无向图,矩阵对称 
    }

}
/*     邻接表     */
#include 
using namespace std;

#define MAXVEX 100                  // 最大定点数     (用户自定义) 
typedef char VertexType;            // 顶点类型       (用户自定义) 
typedef int EdgeType;               // 边上的权值类型 (用户自定义) 

// 边表结点 (表身)
typedef struct EdgeNode
{
    int adjvex;                     // 邻接点域,存储该顶点对应的下标 
    EdgeType weight;                // 用于存储权值 
    struct EdgeNode *next;          // 链域,指向下一个邻接点 
} EdgeNode;

// 顶点表结点 (表头)
typedef struct VertexNode
{
    VertexType data;                // 顶点域吗,存储顶点信息 
    EdgeNode *firstedge;            // 边表头指针 
} VertexNode, AdjList[MAXVEX];

// 总表头 
typedef struct
{
    AdjList adjList;
    int numVertexes,numEdges;       // 图中当前顶点数和边数 
} GraphAdjList;

/* 建立图的邻接表结构 */
void CreateALGraph(GraphAdjList *G)
{
    int i,j,k;
    EdgeType w;
    EdgeNode *e;
                                        // 输入顶点数和边数 
    cout<<"输入顶点数和边数:";
    cin>>G->numVertexes>>G->numEdges;
                                            // 输入顶点信息 
    cout<<"输入各顶点的信息:"<for(i=0; inumVertexes; i++)
    {
        cin>>G->adjList[i].data;
        G->adjList[i].firstedge = NULL;     // 将边表置为空表 
    }
                                            // 输入边信息 
    cout<<"输入各边(vi,vj)上的顶点序号以及权值:"<for(k=0; knumEdges; k++)
    {
        cin>>i>>j>>w;

        e = new EdgeNode;                   // 分配内存 生成边表结点 

        e->adjvex = j;                      // 邻接序号为j 
        e->weight = w;                      // 当前边权值为w 
        e->next = G->adjList[i].firstedge;  // 边表结点指向 顶点指向的结点 
        G->adjList[i].firstedge = e;        // 当前顶点的指针指向边表结点 

        e->adjvex = i;                      // 邻接序号为i
        e->weight = w;                      // 当前边权值为w 
        e->next = G->adjList[j].firstedge;  // 边表结点指向 顶点指向的结点
        G->adjList[j].firstedge = e;        // 当前顶点的指针指向边表结点
    }
}

你可能感兴趣的:(数据结构)