数据结构——图的邻接矩阵表示法
来源:互联网 发布:录屏软件破解版 编辑:程序博客网 时间: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;}