1.简介
实现初始化、加边、加顶点、删边、删顶点、遍历等操作。
2.代码
a.头文件及宏定义
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
#define MAX 100
b.子程序
(1)数据结构定义及相关操作
//定义邻接矩阵
typedef struct
{
int vexnum;//顶点数
int edgnum;//边数
char vexs[MAX];//顶点集合
int matrix[MAX][MAX];//邻接矩阵
}Graph,*PGraph;
//初始化邻接矩阵
void gpinit(PGraph&p)
{
int i,j;
p = new Graph[sizeof(Graph)];
p->vexnum=0;
p->edgnum=0;
for(i=0;i<MAX;i++)
for(j=0;j<MAX;j++)
p->matrix[i][j]=0;
}
(2)输出邻接矩阵
void showgp(PGraph p)
{
int i=0,j=0;
//输出横坐标
cout<<" ";
while(p->vexnum>i)
{
cout<<p->vexs[i++]<<" ";
}
i=0;
cout<<'\n';
//输出邻接矩阵
while(p->vexnum>i)
{
cout<<p->vexs[i]<<" ";
while((p->vexnum>j))
{
cout<<p->matrix[i][j++]<<" ";
}
j=0;
i++;
cout<<'\n';
}
}
(3)加边(点)、删边(点)
int getposition(PGraph p,char a)
{
int k;
for(k=0;k<p->vexnum;k++)
if(a==p->vexs[k])
return k;
return p->vexnum;
}
void addedg(PGraph p)
{
char a[2];
int i,j;//存储点的序号
cout<<"要连接哪两个点?\n"<<flush;
cin>>a[0]>>a[1];
i=getposition(p,a[0]);
j=getposition(p,a[1]);
if(i>=p->vexnum || j>=p->vexnum)
cout<<"不存在该点 请先添加该点"<<endl;
else if(p->matrix[i][j]==1)
cout<<"这两条边已经连在一起了"<<endl;
else
{
p->matrix[i][j]=1;
p->edgnum++;
}
showgp(p);
}
void addvex(PGraph&p)
{
char a;
if(p->vexnum>=MAX)
cout<<"数组已满 请删除元素"<<flush;
else
{
cout<<"请输入要添加的定点名称:"<<endl;
cin>>a;
if(getposition(p,a)>=p->vexnum)
{
p->vexnum++;
p->vexs[p->vexnum-1]=a;
}
else
cout<<"已存在该点 禁止重复添加"<<endl;
}
showgp(p);
}
void delvex(PGraph p)
{
char a;
int i,j,k;
if(p->vexnum==0)
cout<<"数组已空 无需删除元素"<<flush;
else
{
cout<<"请输入要删除的顶点:"<<endl;
cin>>a;
i=j=getposition(p,a);
if(j < p->vexnum)
{
//删除顶点
for(;j<p->vexnum-1;j++)
p->vexs[j]=p->vexs[j+1];
cout<<i<<endl;
for(j=0;j<=i;j++)
for(k=i;k<p->vexnum-1;k++)
{
cout<<j<<' '<<k<<' '<<p->matrix[j][k]<<endl;
p->matrix[j][k]=p->matrix[j][k+1];
p->matrix[k][j]=p->matrix[k+1][j];
}
for(j=i;j<p->vexnum-1;j++)
for(k=i;k<p->vexnum-1;k++)
{
p->matrix[j][k]=p->matrix[j+1][k+1];
}
for(i=0;i<p->vexnum;i++)
{
p->matrix[i][p->vexnum-1]=0;
p->matrix[p->vexnum-1][i]=0;
}
p->vexnum--;
}
else
cout<<"该点不存在"<<endl;
}
showgp(p);
}
void deledg(PGraph p)
{
char a[2];
int i,j;//存储点的序号
cout<<"要删除哪条边?\n"<<flush;
cin>>a[0]>>a[1];
i=getposition(p,a[0]);
j=getposition(p,a[1]);
if(i>=p->vexnum || j>=p->vexnum)
cout<<"不存在该点 请先添加该点"<<endl;
else if(p->matrix[i][j]==0)
cout<<"这两条边没有连在一起"<<endl;
else
{
p->matrix[i][j]=0;
p->edgnum--;
}
showgp(p);
}
(4)遍历
void DFS(int v,PGraph&p) //深度优先遍历
{
memset(flag,0,sizeof(flag));//将标志数组置0
flag[v]=1;
cout<<p->vexs[v]<<" ";
for(int i=0;i<p->vexnum;i++){
if(p->matrix[v][i]&&!flag[i]) //该点和其他点之间有连接且未曾被遍历
DFS(i,p);//递归遍历
}
}
void BFS(int v,PGraph&p)//广度优先遍历
{
memset(flag,0,sizeof(flag));//将标志数组置0
flag[v]=1;
cout<<p->vexs[v]<<" ";
queue<int> q;//创建整型队列
q.push(v);
while(!q.empty()){//对队列进行判空操作 检验遍历是否完成
int w=q.front();//记录当前指向的顶点
q.pop();//顶点出队
for(int i=0;i<p->vexnum;i++)
{
if(p->matrix[w][i]&&!flag[i])//该点和其他点之间有连接且未曾被遍历
{
q.push(i);//将这些点入队
cout<<p->vexs[i]<<" ";
flag[i]=1;
}
}
}
}
(5)程序运行引导
void tips(PGraph p)
{
int a;
cout<<"输入您要对有向图进行的操作:1 加边;2 加顶点;3 删边;4 删顶点;5 DFS;6 BFS;输入其他任意值退出程序\n";
cin>>a;
switch(a)
{
case 1:addedg(p);break;
case 2:addvex(p);break;
case 3:deledg(p);break;
case 4:delvex(p);break;
case 5:DFS(0,p);break;
case 6:BFS(0,p);break;
default:State=1;break;
}
}
c.主程序
void main()
{
PGraph p;
gpinit(p);
showgp(p);
while(1)
{
tips(p);
if(State==1)
break;
}
}