使用邻接表表示法创建无向图以及部分操作

#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