#include <iostream>
using namespace std;
//图的邻接表存储表示
#define MVNum 100
typedef struct ArcNode
{
int adjvex;
struct ArcNode *nextarc;
//OtherInfo info;
}ArcNode;
typedef struct VNode
{
char data;
ArcNode *firstarc;
}VNode,AdjList[MVNum];
typedef struct
{
AdjList vertices;
int vexnum,arcnum;
}ALGraph;
//确定定点在G中的位置
int LocateVex(ALGraph G,char v)
{
int i;
for(i=0;i<G.vexnum;i++)
{
if(G.vertices[i].data==v)break;
}
return i;
}
//采用邻接表表示法,创建无向图G
void CreateUDG(ALGraph &G)
{
int i,j,k;
char v1,v2;
ArcNode *p1;ArcNode *p2;
cout<<"请输入有向图的总顶点数及边数(以空格隔开):"<<endl;
cin>>G.vexnum>>G.arcnum;
cout<<"请依次输入各顶点的信息(如 a):"<<endl;
for(i=0;i<G.vexnum;++i)
{
cout<<"请依次输入第"<<i+1<<"个顶点:";
cin>>G.vertices[i].data;
G.vertices[i].firstarc=NULL;
}
cout<<"请输入各条边依附的顶点(如 a b):"<<endl;
for(k=0;k<G.arcnum;++k)
{
cout<<"请输入第"<<k+1<<"条边依附的顶点:";
cin>>v1>>v2;
i=LocateVex(G,v1);j=LocateVex(G,v2);
p1=new ArcNode;
p1->adjvex=j;
p1->nextarc=G.vertices[i].firstarc;G.vertices[i].firstarc=p1;
p2=new ArcNode;
p2->adjvex=i;
p2->nextarc=G.vertices[j].firstarc;G.vertices[j].firstarc=p2;
}
cout<<"创建成功!"<<endl;
}
void display(ALGraph G)
{
int i;
cout << "*****邻接表表示法创建的无向图*****" << endl;
for(i = 0 ; i < G.vexnum ; ++i){
VNode temp = G.vertices[i];
ArcNode *p = temp.firstarc;
if(p == NULL){
cout << G.vertices[i].data;
}
else{
cout << temp.data;
while(p){
cout << "->";
cout << p->adjvex+1;
p = p->nextarc;
}
}
cout << endl;
}
}
//增加一个新顶点
void Insert_Vex(ALGraph &G,char v)
{
cout<<"请输入新顶点的信息:";
cin>>v;
G.vertices[G.vexnum].data=v;
G.vertices[G.vexnum].firstarc=NULL;
G.vexnum++;
cout<<"增加成功!"<<endl;
}
//删除顶点v及其相关的边
void Delete_Vex(ALGraph &G,char v)
{
ArcNode *p1,*p2;
p1=new ArcNode;p2=new ArcNode;
cout<<"请输入需要删除的顶点:";
cin>>v;
int i=LocateVex(G,v);
G.vertices[i].firstarc=NULL;
for(int j=i;j<G.vexnum-1;j++)
{
G.vertices[j]=G.vertices[j+1];
}
G.vexnum--;
for(int k=0;k<G.vexnum;k++)
{
p1=G.vertices[k].firstarc;p2=p1->nextarc;
if((*p1).adjvex==i)
{
G.vertices[k].firstarc=p1->nextarc;
while(p2)
{
if((*p2).adjvex>i)(*p2).adjvex--;
p2=p2->nextarc;
}
}
else if((*p1).adjvex>i)
{
(*p1).adjvex--;
while(p2)
{
if((*p2).adjvex==i)p1->nextarc=p2->nextarc;
else if((*p2).adjvex>i)(*p2).adjvex--;
p1=p1->nextarc;
p2=p2->nextarc;
}
}
else
{
while(p2)
{
if((*p2).adjvex==i)p1->nextarc=p2->nextarc;
else if((*p2).adjvex>i)(*p2).adjvex--;
p1=p1->nextarc;
p2=p2->nextarc;
}
}
}
cout<<"删除成功!"<<endl;
}
//增加一条边
void Insert_Arc(ALGraph &G,char v,char w)
{
int i,j;
ArcNode *p1,*p2;
cout<<"请输入新边依附的两个顶点:";
cin>>v>>w;
if((i=LocateVex(G,v))<0) cout<<"位置有误,插入失败!"<<endl;
if((j=LocateVex(G,w))<0) cout<<"位置有误,插入失败!"<<endl;
p1=new ArcNode;
p1->adjvex=j;
p1->nextarc=G.vertices[i].firstarc;G.vertices[i].firstarc=p1;
p2=new ArcNode;
p2->adjvex=i;
p2->nextarc=G.vertices[j].firstarc;G.vertices[j].firstarc=p2;
G.arcnum++;
cout<<"增加成功!"<<endl;
}
//删除一条边
void Delete_Arc(ALGraph &G,char v,char w)
{
int i,j;
ArcNode *p1,*p2;
ArcNode *q1,*q2;
p1=new ArcNode;p2=new ArcNode;
q1=new ArcNode;q2=new ArcNode;
cout<<"请输入要删除的边依附的顶点:";
cin>>v>>w;
if((i=LocateVex(G,v))<0) cout<<"该边不存在,删除失败!"<<endl;
if((j=LocateVex(G,w))<0) cout<<"该边不存在,删除失败!"<<endl;
p1=G.vertices[j].firstarc;p2=p1->nextarc;
if((*p1).adjvex==i)G.vertices[j].firstarc=p1->nextarc;
else
{
while(p2)
{
if((*p2).adjvex==i)p1->nextarc=p2->nextarc;
p1=p1->nextarc;
p2=p2->nextarc;
}
}
p1=G.vertices[i].firstarc;p2=p1->nextarc;
if((*p1).adjvex==j)G.vertices[i].firstarc=p1->nextarc;
else
{
while(p2)
{
if((*p2).adjvex==j)p1->nextarc=p2->nextarc;
p1=p1->nextarc;
p2=p2->nextarc;
}
}
cout<<"删除成功!"<<endl;
}
//主函数
int main()
{
ALGraph G;int x;char v,w;
cout << "******欢迎使用邻接表表示法创建无向网******" <<endl;
CreateUDG(G);
cout<<"********************功能菜单**********************"<<endl;
cout <<"[1]、增加一个新顶点"<<'\t'<<"[2]、删除顶点v及其相关的边"<<endl;
cout <<"[3]、增加一条边"<<'\t'<<'\t'<<"[4]、删除一条边"<<endl;
cout <<"[5]、输出邻接表"<<'\t'<<'\t'<<"[0]、退出"<<endl;
cout<<"**************************************************"<<endl;
cout <<"请选择功能键:"<<endl;
do{
cin>>x;
switch(x)
{
case 1:Insert_Vex(G,v);break;
case 2:Delete_Vex(G,v);break;
case 3:Insert_Arc(G,v,w);break;
case 4:Delete_Arc(G,v,w);break;
case 5:display(G);break;
case 0:cout<<"已退出!"<<endl;return 0;
default:cout<<"输入错误,请重新输入!"<<endl;
}
cout<<"********************功能菜单**********************"<<endl;
cout <<"[1]、增加一个新顶点"<<'\t'<<"[2]、删除顶点v及其相关的边"<<endl;
cout <<"[3]、增加一条边"<<'\t'<<'\t'<<"[4]、删除一条边"<<endl;
cout <<"[5]、输出邻接表"<<'\t'<<'\t'<<"[0]、退出"<<endl;
cout<<"**************************************************"<<endl;
cout <<"请选择功能键:"<<endl;
}while(true);
}
使用邻接表表示法创建无向图以及部分操作
猜你喜欢
转载自blog.csdn.net/qq_42451835/article/details/84994352
今日推荐
周排行