数据结构——图的邻接矩阵表示法

来源:互联网 发布:录屏软件破解版 编辑:程序博客网 时间:2024/04/29 18:48
#include <iostream>using namespace std;        #define MAX_VERTEX_NUM    10        //最大顶点个数typedef char VERTYPE;typedef struct{    VERTYPE    vexs[MAX_VERTEX_NUM];    //顶点向量    int        arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];                    //邻接矩阵    int        vexnum,arcnum;            //图的当前顶点数和弧数}mgraph, * MGraph;void init_mgraph(MGraph &g)    //初始化图{    g=(MGraph)malloc(sizeof(mgraph));    g->vexnum=0;    g->arcnum=0;    for(int i=0;i<MAX_VERTEX_NUM;i++)        g->vexs[i]=0;    for(i=0;i<MAX_VERTEX_NUM;i++)        for(int j=0;j<MAX_VERTEX_NUM;j++)            g->arcs[i][j]=0;}void add_vexs(MGraph &g)    //增加顶点{    cout<<"请输入顶点的个数:"<<endl;    cin>>g->vexnum;    cout<<"请输入顶点的值"<<endl;    for(int i=0;i<g->vexnum;i++)    {        cin>>g->vexs[i];    }}void add_arcs(MGraph &g)    //增加边{    cout<<"请输入边的个数:"<<endl;    cin>>g->arcnum;    VERTYPE ch1,ch2;    int row,col;    for(int i=0;i<g->arcnum;i++)    {            cin>>ch1>>ch2;        for(int j=0;j<g->vexnum;j++)        {            if(g->vexs[j]==ch1)            {                row=j;            }            if(g->vexs[j]==ch2)            {                col=j;            }        }        g->arcs[row][col]=1;    //有向带权图只需把1改为weight        g->arcs[col][row]=1;    //无向图加上此行    }}void creat_mgraph(MGraph &g) //创建图    {    add_vexs(g);    //增加顶点    add_arcs(g);    //增加边}void print_mgraph(MGraph &g) //打印图{    for(int i=0;i<g->vexnum;i++)        cout<<"  "<<g->vexs[i];    cout<<endl;    for(i=0;i<g->vexnum;i++)    {        cout<<g->vexs[i]<<" ";        for(int j=0;j<g->vexnum;j++)        {            cout<<g->arcs[i][j]<<"  ";        }        cout<<endl;    }}//删除顶点void delete_vex(MGraph &g,VERTYPE ch){    int row;    int i,j;    for(i=0;i<g->vexnum;i++)    {        if(g->vexs[i]==ch)        {            row=i;        }    }    int arcs=0;    //记录删除顶点的弧数,然后总弧数减去此值    for(i=0;i<g->vexnum;i++)    {        if(g->arcs[row][i] == 1)            arcs++;    }    for(i=0;i<g->vexnum;i++)    {        for(j=row;j<g->vexnum-1;j++)            g->arcs[i][j]=g->arcs[i][j+1];    //把删除顶点右边的数据左移        g->arcs[i][j+1]=0;    }    for(i=row;i<g->vexnum-1;i++)    {        for(j=0;j<g->vexnum;j++)            g->arcs[i][j]=g->arcs[i+1][j];    //把删除顶点下边的数据上移        g->arcs[i+1][j]=0;    }    for(i=row;i<g->vexnum-1;i++)    //把顶点数组中右边的顶点左移        g->vexs[i]=g->vexs[i+1];    g->vexnum=g->vexnum-1;        //顶点个数减1    g->arcnum=g->arcnum-arcs;    //总弧数减去要删除顶点的弧数}int main(){    MGraph G;    init_mgraph(G);        //初始化图    creat_mgraph(G);    //创建图    print_mgraph(G);    //打印图    //删除顶点    VERTYPE ch;    cin>>ch;    delete_vex(G,ch);    cout<<G->arcnum<<"  "<<G->vexnum<<endl;    print_mgraph(G);    return 0;}

原创粉丝点击