用邻接矩阵和邻接表创建图

十年热恋 提交于 2020-01-28 16:14:18
#include <iostream>
using namespace std;

#define INFINITY 65536//无穷大
#define    MAX_VERTEX_NUM 10//最大顶点个数
typedef enum{DG,DN,UDG,UDN}GraphKind;//有向图,有向网,无向图,无向网
struct Graph
{
    char vexs[MAX_VERTEX_NUM];//储存顶点
    int arc[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵
    int vexnum, arcnum;//顶点数和边(弧)数
    GraphKind kind;//图的种类
};
//确定顶点序号
int LocateVex(Graph *G, char ch)
{
    for (int i = 0; i < G->vexnum; i++)
        if (G->vexs[i] == ch)
        {
            return i;//返回顶点序号
            break;
        }
    return -1;
}
void CreateUDN(Graph *G)//创建无向网
{
    int i, j;
    char v1, v2;//记录顶点名称
    int w;//记录权值
    cout << "请输入顶点个数:" << endl;cin >> G->vexnum;
    cout << "请输入边的个数:" << endl;cin >> G->arcnum;
    cout << "构造顶点:" << endl;
    for (int i = 0; i < G->vexnum; i++)//构造顶点
        cin >> G->vexs[i];
    for (int i = 0; i < G->vexnum; i++)//初始化邻接矩阵
        for (int j = 0; j < G->vexnum; j++)
            G->arc[i][j] = 0;
    cout << "构造邻接矩阵:" << endl;
    for (int k = 0; k < G->arcnum; k++)
    {
        cin >> v1 >> v2 >> w;
        i = LocateVex(G, v1);
        j = LocateVex(G, v2);
        G->arc[j][i] = G->arc[i][j] = w;
    }
}
void CreateGraph(Graph *G)
{
    switch (G->kind)
    {
    //case DG:return CreateDG(G);
    //case DN:return CreateDN(G);
    //case UDG:return CreateUDG(G);
    case UDN:return CreateUDN(G);
    }
}
//遍历邻接矩阵
void PrintArc(Graph *G)
{
    int i, j;
    for (i = 0; i < G->vexnum; i++)
    {
        for (j = 0; j < G->vexnum; j++)
            cout << G->arc[i][j] << " ";
        cout << endl;
    }
}

//邻接表
struct ENode//边结点
{
    int index;//边所指向的点的序号
    int info;//记录权值
    struct ENode* next;//指向下一条边
};
struct VNode//顶点结点
{
    char data;//顶点名称
    ENode* first;//指向顶点的第一个邻边
};
struct AGraph//记录图的信息
{
    int vexnum, arcnum;//顶点数和边数
    VNode p[MAX_VERTEX_NUM];//顶点数组
    GraphKind kind;//图的种类
};
int LocateVex(AGraph *G,char ch)
{
    for (int i = 0; i < G->vexnum; i++)
        if (ch == G->p[i].data)
        {
            return i;
            break;
        }
    return -1;
}
//创建邻接表
void CreateAGraph(AGraph *G)
{
    int i, j, info;
    char v1, v2;
    cout << "请输入顶点个数:" << endl; cin >> G->vexnum;
    cout << "请输入边的个数:" << endl; cin >> G->arcnum;
    cout << "构造顶点:" << endl;
    for (int i = 0; i < G->vexnum; i++)//构造顶点数组
    {
        cin >> G->p[i].data;
        G->p[i].first = NULL;
    }
    cout << "构造邻接表:" << endl;
    for (int k = 0; k < G->arcnum; k++)
    {
        cin >> v1 >> v2 >> info;
        i = LocateVex(G, v1);
        j = LocateVex(G, v2);
        ENode *E = (ENode*)malloc(sizeof(ENode));
        E->index = j;
        E->info = info;
        E->next = G->p[i].first;//头插法
        G->p[i].first = E;
    }
}
//打印邻接表
void PrintAGraph(AGraph *G)
{
    for (int i = 0; i < G->vexnum; i++)
    {
        cout << G->p[i].data;
        if (G->p[i].first != NULL)
        {
            ENode *p = G->p[i].first;
            while (p->next != NULL)
            {
                cout << "->" << p->index;
                p = p->next;
            }
            cout << "->" << p->index;
        }
        cout << endl;
    }
}
int main()
{
    Graph *G=(Graph*)malloc(sizeof(Graph));
    G->kind = UDN;
    CreateGraph(G);
    PrintArc(G);
    cout << endl;
    cout << "-------------------------------------" << endl;
    cout << "邻接表:" << endl;
    AGraph *AG=(AGraph*)malloc(sizeof(AGraph));
    CreateAGraph(AG);
    PrintAGraph(AG);
    system("pause");
    return 0;
}

运行结果:

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!