数据结构(C语言版) 图 算法设计Demo1

Posted Aiden (winner)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构(C语言版) 图 算法设计Demo1相关的知识,希望对你有一定的参考价值。

分别以邻接矩阵和邻接表作为存储结构,实现以下图的基本操作:
① 增加一个新顶点v,InsertVex(G, v);
② 删除顶点v及其相关的边,DeleteVex(G, v);
③ 增加一条边<v,w>,InsertArc(G, v, w);
④ 删除一条边<v,w>,DeleteArc(G, v, w)。

[算法描述]

//假设图G为有向无权图,以邻接矩阵作为存储结构四个算法分别如下:	
//① 增加一个新顶点v
Status Insert_Vex(MGraph &G, char v)//在邻接矩阵表示的图G上插入顶点v
	if(G.vexnum+1)
		>MAX_VERTEX_NUM return INFEASIBLE;
		G.vexs[++G.vexnum]=v;
	return OK;
//Insert_Vex

//② 删除顶点v及其相关的边
Status Delete_Vex(MGraph &G,char v)//在邻接矩阵表示的图G上删除顶点v
n=G.vexnum;
	if((m=LocateVex(G,v))<0)
		return ERROR;
		G.vexs[m]<->G.vexs[n]; //将待删除顶点交换到最后一个顶点
		for(i=0;i<n;i++)
			G.arcs[m]=G.arcs[n];
			G.arcs[m]=G.arcs[n]; //将边的关系随之交换
	
	G.arcs[m][m].adj=0;
	G.vexnum--;
	return OK;
//Delete_Vex
//分析:如果不把待删除顶点交换到最后一个顶点的话,算法将会比较复杂,而伴随着大量元素的移动,时间复杂度也会大大增加。
//③ 增加一条边<v,w>
Status Insert_Arc(MGraph &G,char v,char w)//在邻接矩阵表示的图G上插入边(v,w)
	if((i=LocateVex(G,v))<0) return ERROR;
	if((j=LocateVex(G,w))<0) return ERROR;
	if(i==j) return ERROR;
	if(!G.arcs[j].adj)
		G.arcs[j].adj=1;
		G.arcnum++;
	
	return OK;
//Insert_Arc

//④ 删除一条边<v,w>
Status Delete_Arc(MGraph &G,char v,char w)//在邻接矩阵表示的图G上删除边(v,w)
	if((i=LocateVex(G,v))<0) return ERROR;
	if((j=LocateVex(G,w))<0) return ERROR;
	if(G.arcs[j].adj)
		G.arcs[j].adj=0;
		G.arcnum--;
	
	return OK;
//Delete_Arc

//以邻接表作为存储结构,本题只给出Insert_Arc算法.其余算法类似。
Status Insert_Arc(ALGraph &G,char v,char w)//在邻接表表示的图G上插入边(v,w)
	if((i=LocateVex(G,v))<0) return ERROR;
	if((j=LocateVex(G,w))<0) return ERROR;
	p=new ArcNode;
	p->adjvex=j;
	p->nextarc=NULL;
	if(!G.vertices.firstarc)
		G.vertices.firstarc=p;
	else
		for(q=G.vertices.firstarc;q->q->nextarc;q=q->nextarc)
	if(q->adjvex==j)
		return ERROR; //边已经存在
	q->nextarc=p;
	
	G.arcnum++;
	return OK;
//Insert_Arc

以上是关于数据结构(C语言版) 图 算法设计Demo1的主要内容,如果未能解决你的问题,请参考以下文章

数据结构(C语言版) 树和二叉树 算法设计Demo1

数据结构(C语言版) 栈和队列 算法设计Demo1

数据结构(C语言版) 串数组和广义表 算法设计Demo1

数据结构(C语言版) 图 算法设计Demo2

数据结构(C语言版) 图 算法设计Demo4

数据结构(C语言版) 图 算法设计Demo3