图的邻接矩阵代码实现
今天看了下图的一些基本概念,由于有图形,因此关于图的知识点理解起来还算轻松,苦于就是各种各样的基本操作的代码实现;
由于自己编程能力停留在会点基本的C++,因此书上或者网上找到的代码自己完全不能消化,还好,最后在B站上面看到了一个up主自己写的视频,如获至宝。刚开始竟然跟着视频写运行结果都报错,好在自己耐心仔细检查,最后终于可以跑通。
关于代码的实现,自己的切身体会是首先要对定义图这种对象时,它身上的几个变量要有清晰的认识(下面做了一个表统计),然后就是关于在图的邻接矩阵基础上进行的各种操作,比如添加顶点,删除顶点等等,窃以为删除顶点那块稍微有点复杂,可以自己在草稿纸上画一个具体的邻接矩阵然后结合着代码来理解会更加透彻。
图定义里面的变量
变量 | 含义 |
---|---|
int Vertex[MAXVEX] | 这个数组是用来存储结点的序号 |
char Vername[MAXVEX] | 这个数组用来存储结点的名字 |
int arc[MAXVEX][MAXVEX] | 这个是邻接矩阵 |
int vexnum | 顶点数 |
int edgenum | 边数 |
#include<iostream>
#define MAXVEX 10
#define INF 99
using namespace std;
//面向对象的方法
class MGraph {
public:
//初始化
void InitMGraph()
{
for (int i = 0; i < MAXVEX; i++)
{
for(int j = 0; j < MAXVEX; j++)
{
arc[i][j] = INF;
}
}
}
//创建邻接矩阵
void Creat()
{
cout << "请输入邻接矩阵的有关信息:" << endl;
int i, j, k, w;
cout << "请输入顶点数和边数:" << endl;
cin >> vexnum>> edgenum;
cout << "请输入顶点信息:" << endl;
for (int i = 0; i < vexnum; i++)
{
Vertex[i] = i; //存储序号
cin >> Vername[i]; //输入顶点名字
}
for (k = 0; k < edgenum; k++)
{
cout << "请输入边(vi,vj)的下标i,j和权w:" << endl;
cin >> i >> j >> w;
arc[j][i]=arc[i][j] = w;//因为邻接矩阵是对称的
}
}
//输出邻接矩阵
void Print()
{
cout << "邻接矩阵:" << endl;
for (int i = 0; i < vexnum; i++)
{
for (int j = 0; j < vexnum; j++)
{
printf("%4d", arc[i][j]);//%4d能控制对齐
}
cout << endl;
}
}
//返回顶点在图的位置
int LocateVex(char ch)
{
for (int i = 0; i < vexnum; i++)
{
if (ch == Vername[i])
{
break;
}
if (i == vexnum)
{
return -1;
}
else
{
return i;
}
}
}
//增加某个顶点
void InsertVex(char ch)
{
Vertex[vexnum] = vexnum;
Vername[vexnum] = ch;
vexnum++; //顶点数自增
}
//删除某个顶点
void DeleteVex(char ch)
{
int i, j, k;
//遍历寻找顶点位置
for ( i = 0; i < vexnum; i++)
{
if (ch == Vername[i])
break;
}
//Vername数组循环左移
for (j = i; j < vexnum - 1; j++)
{
Vername[j] = Vername[j + 1];//覆盖删除的顶点
}
//arc数组循环左移和上移
//上移
for (j = i; j < vexnum - 1; j++)
{
for (k = 0; k < vexnum; k++)
{
arc[j][k] = arc[j + 1][k];
}
}
//左移
for (j = 0; j < vexnum-1; j++)
{
for (k = i; k < vexnum-1; k++)
{
arc[j][k] = arc[j][k + 1];
}
}
vexnum--;
}
//增加某条边
void InsertEdge(int i, int j, int w)
{
arc[i][j] = w;
edgenum++;
};
//删除某条边
void DeleteEdge(int i, int j)
{
arc[i][j] = INF;
edgenum--;
}
//返回第一个邻接顶点
char FirstAdjVex(char ch)
{
int i, j;
for (i = 0; i < vexnum; i++)
{
if (ch == Vername[i])
break;
}
for (j = 0; j < vexnum; j++)
{
if (arc[i][j] != INF)
break;
}
if (i == vexnum)
return'\0';
else
return Vername[j];
}
private:
int Vertex[MAXVEX]; //这个就是存储结点的序号
char Vername[MAXVEX]; //这个存储结点的名字
int arc[MAXVEX][MAXVEX]; //邻接矩阵
int vexnum; //顶点数
int edgenum; //边数
};
int main()
{
MGraph MyGraph;
MyGraph.InitMGraph();
MyGraph.Creat();
MyGraph.Print();
//增加顶点
char ch;
cout << "请输入要增加的顶点信息:";
cin >> ch;
MyGraph.InsertVex(ch);
MyGraph.Print();
//删除顶点
cout << "请输入要删除的顶点的信息:";
cin >> ch;
MyGraph.DeleteVex(ch);
MyGraph.Print();
//返回第一个邻接顶点
cout << "请输入你要查找的顶点:";
cin >> ch;
ch = MyGraph.FirstAdjVex(ch);
if (ch == '\0')
cout << "给顶点不存在邻接顶点" << endl;
else
cout << "该顶点的第一个邻接顶点是" << ch;
system("pause");
return 0;
}