#include<iostream>
using namespace std;
const int maxsize=100;
typedef struct ArcNode{//边表节点
int adjV;
struct ArcNode* next;
}ArcNode;
typedef struct VNode{//顶点表节点
char data;
ArcNode* first;
}VNode;
typedef struct AGraph{
VNode adjList[maxsize];
int n,e;
}AGraph;
void creatAGraph(AGraph* g){
cout<<"输入顶点和边数:" ;
cin>>g->n>>g->e;
cout<<"输入下标从0到n-1号顶点的data:" ;
for(int i=0;i<g->n;i++){
cin>>g->adjList[i].data;
g->adjList[i].first=NULL;
}
cout<<"输入下标从a到b的e条边:" <<endl;
for(int i=0;i<g->e;i++){
int a,b;
cin>>a>>b;
ArcNode* node=new ArcNode;
node->adjV=b;
node->next=g->adjList[a].first;
g->adjList[a].first=node;
}
}
void reverseAGraph(AGraph* g,AGraph* rg){
rg->n=g->n;rg->e=g->e;
for(int i=0;i<rg->n;i++){
rg->adjList[i].data=g->adjList[i].data;
rg->adjList[i].first=NULL;
}
for(int i=0;i<g->n;i++){
ArcNode* p=g->adjList[i].first;
while(p){
int a=p->adjV;
ArcNode* node=new ArcNode;
node->adjV=i;
node->next=rg->adjList[a].first;
rg->adjList[a].first=node;
p=p->next;
}
}
}
void show(AGraph* g){
for(int i=0;i<g->n;i++){
cout<<g->adjList[i].data;
ArcNode* p=g->adjList[i].first;
while(p){
cout<<"->"<<g->adjList[p->adjV].data;
p=p->next;
}
cout<<endl;
}
}
int main(){
AGraph g,rg;
creatAGraph(&g);
reverseAGraph(&g,&rg);
cout<<"邻接表:"<<endl;show(&g);
cout<<"逆邻接表:"<<endl;show(&rg);
}
【C++】已知有n个顶点的有向图G的邻接表,设计算法求图G的逆邻接表
于 2024-08-08 14:33:14 首次发布