数据结构:图的邻接矩阵完整实现,包含图的深度遍历,广度遍历,节点删除,添加

#include <iostream>
#include <queue>
#include <stdlib.h>
#include <vector>
#include <string.h>
using namespace std;
#define MAX_VERTEX 100
typedef void visit(int pos);
enum GraphType{DG,DN,AG,AN};
typedef int VertexType;
typedef int ArcType;
typedef struct{int i;int j;int w;}ArcCell;
typedef struct Graph{
ArcType matrix[MAX_VERTEX][MAX_VERTEX];
VertexType vertex[MAX_VERTEX];
int verNum;
int arcNum;
enum GraphType type;
}MGraph;
class MyGraph{
public:
explicit MyGraph();
void create(GraphType type,VertexType vertex[],int vNum,ArcCell arcs[],int arcNum);
void destroy();
VertexType getValue(int vPos);
void setValue(int vPos,VertexType data);
int locate(VertexType data);
int firstAdjVertex(int vPos);
int nextAdjVertex(int vPos,int after);
void insertVertex(VertexType data);
void deleteVertex(int vPos);
void insertArc(int iPos,int jPos,int w);
void deleteArc(int iPos,int jPos);
void DFSTraverse(int vPos,visit func);
void BFSTraverse(int vPos,visit func);
void printMatrix();
private:
void dfs(MGraph *G,int vPos,bool visited[],visit func);
void bfs(MGraph *G,int vPos,bool visited[],visit func);
MGraph G;
};
MyGraph::MyGraph(){
memset(&G,0,sizeof(MGraph));
}
void MyGraph::create(GraphType type,VertexType vertex[],int vNum,ArcCell arcs[],int arcNum)
{
G.type=type;
G.verNum=vNum;
G.arcNum=arcNum;
for(int i=0;i<vNum;i++)G.vertex[i]=vertex[i];
if(type==1||type==0)
{
for(int i=0;i<arcNum;i++){
  int iPos=locate(arcs[i].i);
  int jPos=locate(arcs[i].j);
  G.matrix[iPos][jPos]=arcs[i].w;
  G.matrix[jPos][iPos]=arcs[i].w;
}
}//if
else{
for(int i=0;i<arcNum;i++){
  int iPos=locate(arcs[i].i);
  int jPos=locate(arcs[i].j);
  G.matrix[iPos][jPos]=arcs[i].w;
}
}
}
void MyGraph::destroy()
{
G.verNum=G.arcNum=0;
}
VertexType MyGraph::getValue(int vPos)
{
return G.vertex[vPos];
}
void MyGraph::setValue(int vPos,VertexType data)
{
G.vertex[vPos]=data;
}
int MyGraph::locate(VertexType data)
{
for(int i=0;i<G.verNum;i++)
if(data==G.vertex[i])return i;
return -1;
}
int MyGraph::firstAdjVertex(int vPos)
{
for(int i=0;i<G.verNum;i++)
if(G.matrix[vPos][i])return i;
return -1;
}
int MyGraph::nextAdjVertex(int vPos,int after)
{
for(int i=after+1;i<G.verNum;i++)
if(G.matrix[vPos][i])return i;
return -1;
}
void MyGraph::insertVertex(VertexType data)
{
G.vertex[G.verNum++]=data;
if(G.verNum>MAX_VERTEX){cout<<"overflow";exit(-1);}
}
void MyGraph::deleteVertex(int vPos)
{
int count=0;
G.vertex[vPos]=0;
switch(G.type){
case 0:
case 1:
for(int i=0;i<G.verNum;i++){
  if(G.matrix[vPos][i]>0)count++;
}
break;
case 2:
case 3:
for(int i=0;i<G.verNum;i++){
  if(G.matrix[vPos][i]>0)count++;
}
for(int j=0;j<G.verNum;j++){
  if(G.matrix[j][vPos]>0)count++;
}
break;
default:
break;
}
for(int i=vPos;i<G.verNum-1;i++)
  for(int j=0;j<=G.verNum-1;j++)
  {//replace i row with the i+1 row
     G.matrix[i][j]=G.matrix[i+1][j];
  }
for(int i=vPos;i<G.verNum-1;i++)
  for(int j=0;j<=G.verNum-1;j++)
  {//replace i column with i+1 column
     G.matrix[j][i]=G.matrix[j][i+1];
  }
for(int j=vPos;j<G.verNum-1;j++)
{
  G.vertex[j]=G.vertex[j+1];
}
G.verNum--;
G.arcNum-=count;
}
void MyGraph::insertArc(int iPos,int jPos,int w)
{
if(G.type==0||G.type==1){
G.matrix[iPos][jPos]=w;
G.matrix[jPos][iPos]=w;
}else{
G.matrix[iPos][jPos]=w;
}
}
void MyGraph::deleteArc(int iPos,int jPos)
{
if(G.type==0||G.type==1){
G.matrix[iPos][jPos]=0;
G.matrix[jPos][iPos]=0;
}else{
G.matrix[iPos][jPos]=0;
}
}
void MyGraph::DFSTraverse(int vPos,visit func)
{
bool *visited=new bool[G.verNum];
for(int i=0;i<G.verNum;i++)visited[i]=false;

dfs(&G,vPos,visited,func);
}
void MyGraph::dfs(MGraph *G,int vPos,bool visited[],visit func){
if(!visited[vPos]){
  func(G->vertex[vPos]);
  visited[vPos]=true;
}
for(int i=firstAdjVertex(vPos);i!=-1;i=nextAdjVertex(vPos,i)){
  if(!visited[i])dfs(G,i,visited,func);
}
}
void MyGraph::bfs(MGraph *G,int vPos,bool visited[],visit func){
queue<int> que;
int tmp;
que.push(vPos);
while(!que.empty())
{
tmp=que.front();
que.pop();
if(!visited[tmp]){
func(G->vertex[tmp]);
visited[tmp]=true;
}
for(int i=firstAdjVertex(tmp);i!=-1;i=nextAdjVertex(tmp,i)){
if(!visited[i]){
  que.push(i);
}//if
}//for
}//while
}//return
void MyGraph::BFSTraverse(int vPos,visit func)
{
bool *visited=new bool[G.verNum];
for(int i=0;i<G.verNum;i++)visited[i]=false;

bfs(&G,vPos,visited,func);
}
void MyGraph::printMatrix(){
cout<<"      ";
for(int k=0;k<G.verNum;k++)
   cout<<G.vertex[k]<<"    ";
cout<<endl;
for(int i=0;i<G.verNum;i++)
{
  cout<<G.vertex[i]<<':';
  for(int j=0;j<G.verNum;j++)
    cout<<"    "<<G.matrix[i][j];
  cout<<endl;
}
}
void func(int value){cout<<value<<' ';}
int main(int argc,char *argv[])
{
VertexType vertex[]={1,2,3,4,5,6};
ArcCell arcs[]={
{1,2,2},{1,3,4},{1,4,1},{2,3,2},{2,5,9},{3,4,2},{3,5,4},{4,5,5},{1,6,1}
};
MyGraph g;
g.create(DN,vertex,6,arcs,9);
g.printMatrix();
g.deleteVertex(0);
g.BFSTraverse(0,func);
g.destroy();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值