图的基本操作的实现 发表于 2019-10-28 | 分类于 数据结构 | 次阅读 字数统计: 2k | 阅读时长 ≈ 11 图的三种表示方法图的数组表示法 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200#include<iostream>#include <stdio.h>#include <stdlib.h>using namespace std;#define MAX_NUM 20#define INFINITY INT_MAXtypedef int VRType;typedef char VertexType;typedef enum{DG , DN , UDG , UDN} GraphKind; //{有向图,有向网,无向图,无向网}typedef struct ArcCell{ VRType adj; // 无权图是0和1, 有权图是权值 //InfoType *info;}ArcCell , AdjMatrix[MAX_NUM][MAX_NUM];typedef struct { VertexType vexs[MAX_NUM]; //顶点名称 AdjMatrix arcs; //邻接矩阵 int vexnum , arcnum; //顶点数 和 弧数 //GraphKind kind; //图的类型}MGraph;// 返回顶点在图中的位置 intint LocateVex(MGraph G , VertexType v){ for(int i = 0 ; i<G.vexnum ; ++i){ if(G.vexs[i] == v){ return i; } }}// 无向网 void CreateUDN(MGraph &G){ //scanf(&G.kind); cout<<"构造无向网:"<<endl; cout<<"输入图的顶点数和边数:"<<endl; cin>>G.vexnum>>G.arcnum; cout<<"输入顶点名称:"<<endl; for(int i = 0 ; i<G.vexnum ; ++i){ cin>>G.vexs[i]; } for(int i = 0 ; i<G.vexnum ; ++i){ for(int j = 0 ; j<G.vexnum ; ++j){ G.arcs[i][j].adj = INFINITY; } } cout<<"输入顶点及其权值:"<<endl; for(int k = 0 ; k<G.arcnum ; ++k){ VertexType v1 , v2; int w; cin>>v1>>v2>>w; int i = LocateVex(G , v1); int j = LocateVex(G , v2); G.arcs[i][j].adj = w; G.arcs[j][i].adj = G.arcs[i][j].adj; }}// 有向网 (其实就是无向图去掉了最后一个语句)void CreateDN(MGraph &G){ cout<<"构造有向网:"<<endl; cout<<"输入图的顶点数和边数:"<<endl; cin>>G.vexnum>>G.arcnum; cout<<"输入顶点名称:"<<endl; for(int i = 0 ; i<G.vexnum ; ++i){ cin>>G.vexs[i]; } for(int i = 0 ; i<G.vexnum ; ++i){ for(int j = 0 ; j<G.vexnum ; ++j){ G.arcs[i][j].adj = INFINITY; } } cout<<"输入顶点及其权值:"<<endl; for(int k = 0 ; k<G.arcnum ; ++k){ VertexType v1 , v2; int w; cin>>v1>>v2>>w; int i = LocateVex(G , v1); int j = LocateVex(G , v2); G.arcs[i][j].adj = w; //G.arcs[j][i].adj = G.arcs[i][j].adj; }}// 图的打印void print(MGraph G){ for(int i = 0 ; i<G.vexnum ; ++i){ for(int j = 0 ; j<G.vexnum ; ++j){ if(G.arcs[i][j].adj != INFINITY){ cout<<'('<<G.vexs[i]<<','<<G.vexs[j]<<')'<<' '; } } cout<<endl; } cout<<endl; for(int i = 0 ; i<G.vexnum ; ++i){ for(int j = 0 ; j<G.vexnum ; ++j){ if(G.arcs[i][j].adj == INFINITY){ cout<<0<<' '; } else cout<<G.arcs[i][j].adj<<' '; } cout<<endl; }}void InsertVex(MGraph &G , VertexType v){ G.vexnum++; G.vexs[G.vexnum - 1] = v; for(int i = 0 ; i<G.vexnum ; ++i){ G.arcs[i][G.vexnum - 1].adj = INFINITY; } for(int j = 0 ; j<G.vexnum ; ++j){ G.arcs[G.vexnum - 1][j].adj = INFINITY; }}void InsertArc(MGraph &G , VertexType v , VertexType w){ int i = LocateVex(G , v); int j = LocateVex(G , w); if(i == -1){ G.vexnum++; G.vexs[G.vexnum - 1] = v; for(int i = 0 ; i<G.vexnum ; ++i){ G.arcs[i][G.vexnum - 1].adj = INFINITY; } for(int j = 0 ; j<G.vexnum ; ++j){ G.arcs[G.vexnum - 1][j].adj = INFINITY; } i = G.vexnum - 1; } if(j == -1){ G.vexnum++; G.vexs[G.vexnum - 1] = w; for(int i = 0 ; i<G.vexnum ; ++i){ G.arcs[i][G.vexnum - 1].adj = INFINITY; } for(int j = 0 ; j<G.vexnum ; ++j){ G.arcs[G.vexnum - 1][j].adj = INFINITY; } j = G.vexnum - 1; } G.arcs[i][j].adj = 1; G.arcs[j][i].adj = 1; G.arcnum++;}bool DeleteVex(MGraph &G , VertexType v){ int l = LocateVex(G , v); cout<<l<<endl; if(l == -1){ cout<<"No such point!"<<endl; return false; } for(int i = 0 ; i<G.vexnum ; ++i){ if(G.arcs[i][l].adj != INFINITY){ G.arcs[i][l].adj = INFINITY; G.arcnum--; } } for(int j = 0 ; j<G.vexnum ; ++j){ if(G.arcs[l][j].adj != INFINITY){ G.arcnum--; G.arcs[l][j].adj = INFINITY; } } for(int i = l+1 ; i<G.vexnum ; ++i){ for(int j = 0 ; j<G.vexnum ; ++j){ G.arcs[i-1][j].adj = G.arcs[i][j].adj; } } for(int j = l+1 ; j<G.vexnum ; ++j){ for(int i = 0 ; i<G.vexnum - 1 ; ++i){ G.arcs[i][j-1].adj = G.arcs[i][j].adj; } } for(int i = l+1 ; i<G.vexnum ; ++i){ G.vexs[i-1] = G.vexs[i]; } G.vexnum--; return true;}bool DeleteArc(MGraph &G , VertexType v , VertexType w){ int i = LocateVex(G , v); int j = LocateVex(G , w); G.arcnum--; G.arcs[i][j].adj = INFINITY; G.arcs[j][i].adj = INFINITY;}int main(){ MGraph G; CreateDN(G); print(G);} 图的邻接表表示法1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283#include<iostream>#include <stdio.h>#include <stdlib.h>using namespace std;#define MAX_NUM 20#define INFINITY INT_MAXtypedef char VertexType;//表结点typedef struct ArcNode { int adjvex; //表示头结点的邻接点的序号 ArcNode *nextarc; //指向表示头结点的下一个邻接点 int weight; //无权图是0,1 有权图是权值 //InfoType *info;}ArcNode;//头结点typedef struct VNode { VertexType data; //表示头结点的data ArcNode *firstarc; //指向头结点的第一个邻接点}VNode , AdjList[MAX_NUM];typedef struct{ AdjList vertices; //表结点的数组 int vexnum , arcnum; //顶点数和边数}ALGraph;int LocateVex(ALGraph *G , VertexType v){ for(int i = 0 ; i<G->vexnum ; ++i){ if(G->vertices[i].data == v){ return i; } }}void Create(ALGraph *G){ cout<<"输入图的顶点数和边数:"<<endl; cin>>G->vexnum>>G->arcnum; cout<<"输入顶点信息:"<<endl; for(int i = 0 ; i<G->vexnum ; ++i){ cin>>G->vertices[i].data; G->vertices[i].firstarc = NULL; } cout<<"输入(v1,v2,w):"<<endl; for(int k = 0 ; k<G->arcnum ; ++k){ VertexType v1 , v2; int w; cin>>v1>>v2>>w; int i = LocateVex(G , v1); int j = LocateVex(G , v2); ArcNode *p = (ArcNode *)malloc(sizeof(ArcNode)); p->adjvex = j; p->nextarc = G->vertices[i].firstarc; G->vertices[i].firstarc = p; p->weight = w; //下面代码无向图有,有向图无 p = (ArcNode *)malloc(sizeof(ArcNode)); p->adjvex = i; p->nextarc = G->vertices[j].firstarc; G->vertices[j].firstarc = p; p->weight = w; } //打印图 for(int i = 0 ; i<G->vexnum ; ++i){ ArcNode *p = G->vertices[i].firstarc; while(p){ cout<<'('<<G->vertices[i].data<<','<<G->vertices[p->adjvex].data<<','<<p->weight<<')'<<' '; p = p->nextarc; } cout<<endl; }}int main(){ ALGraph G; Create(&G);} 图的十字链表表示法1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283#include<iostream>#include <stdio.h>#include <stdlib.h>using namespace std;#define MAX_NUM 20#define INFINITY INT_MAXtypedef char VertexType;//表结点typedef struct ArcBox{ int tailvex , headvex; //表示弧尾 和 弧头 的下标位置 ArcBox *hlink , *tlink; //hlink 指向头结点入度相同的表结点(即弧头相同), //tlink指向弧尾相同的表结点 //InfoType *info;}ArcBox;typedef struct VexNode{ VertexType data; //头结点的数据信息 ArcBox *fristin , *fristout;// fristin 指向头结点的第一个入度的表结点, // fristout指向头结点的第一个出度的表结点}VexNode;typedef struct { VexNode xlist[MAX_NUM]; int vexnum , arcnum; //顶点数和边数}OLGraph;int LocateVex(OLGraph G , VertexType v){ for(int i = 0 ; i<G.vexnum ; ++i){ if(G.xlist[i].data == v){ return i; } }}//构造有向图void CreateDG(OLGraph &G){ cout<<"输入图的顶点数和边数:"<<endl; cin>>G.vexnum>>G.arcnum; cout<<"输入图的头结点的数据信息:"<<endl; for(int i = 0 ; i<G.vexnum ; ++i){ cin>>G.xlist[i].data; G.xlist[i].fristin = NULL; G.xlist[i].fristout = NULL; } cout<<"输入(v1,v2):"<<endl; for(int k = 0 ; k<G.arcnum ; ++k){ VertexType v1 , v2; cin>>v1>>v2; int i = LocateVex(G , v1); int j = LocateVex(G , v2); ArcBox *p = (ArcBox *)malloc(sizeof(ArcBox)); p->tailvex = i; p->headvex = j; p->hlink = G.xlist[j].fristin; p->tlink = G.xlist[i].fristout; G.xlist[j].fristin = G.xlist[i].fristout = p; } for(int i = 0 ; i<G.vexnum ; ++i){ ArcBox *p =G.xlist[i].fristout; while(p){ cout<<'('<<G.xlist[i].data<<"->"<<G.xlist[p->headvex].data<<')'<<' '; p = p->tlink; } cout<<endl; } cout<<"---------------------------------------------"<<endl; for(int i = 0 ; i<G.vexnum ; ++i){ ArcBox *p = G.xlist[i].fristin; while(p){ cout<<'('<<G.xlist[i].data<<"<-"<<G.xlist[p->tailvex].data<<')'<<' '; p = p->hlink; } cout<<endl; }}int main(){ OLGraph G; CreateDG(G);}