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

  
    
#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 ;
}

 

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