用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c++代码库

数据结构与算法----4.2 用数组存储图:1、插入一个顶点2、删除一条弧3、删

2019-07-21 作者: Ryan2019举报

[c++]代码库

#include <iostream>
#include <fstream>
using namespace std;
const int Infinity=-1;
typedef char VexType;
struct VexCell//顶点的信息
{
	VexType data;//顶点数据
	bool visited;//是否被访问过
};
struct ArcCell//弧的信息(结构体)
{
	int adj;     
};
const MVN=21;
struct MGraph
{
	VexCell vexs[MVN];//顶点数组
	ArcCell arcs[MVN][MVN];//邻接矩阵
	int kind,vexnum,arcnum;//类型,顶点数,弧数
};
int LocateVex(MGraph &G,VexType v);//查找顶点
bool InsertVex(MGraph &G,VexType u);//插入顶点
bool InsertArc(MGraph &G,VexType u,VexType v,int w=1);//插入弧
bool DeleteArc(MGraph &G,VexType u,VexType v);//删除弧
bool DeleteVex(MGraph &G,VexType v);//删除顶点
void CreateGraph(MGraph&G,char fn[]);//建立图
void Show(MGraph &G);
int main()
{
	
	int count1=0;
	int count2=0;
	MGraph G;
	char fn[]="fn.txt";
	CreateGraph(G,fn);
	Show(G);
	VexType x='s',y='a',z='b',f='a';
	cout<<"插入顶点:"<<x<<endl;
	InsertVex(G,x);
	Show(G);
	cout<<"删除弧的两个顶点:"<<y<<z<<endl;
	DeleteArc(G,y,z);
	Show(G);
	cout<<"要删除的顶点:"<<z<<endl;
	DeleteVex(G,f);
	Show(G);
	return 0;
}

bool InsertVex(MGraph&G,VexType u)
{
	int i;
	if(G.vexnum+1>MVN)return false;
	i=LocateVex(G,u);
	if(i>0)return false;
	G.vexnum++;
	G.vexs[G.vexnum].data=u;
	for(i=1;i<=G.vexnum;i++)
		G.arcs[i][G.vexnum].adj=G.arcs[G.vexnum][i].adj=Infinity;
	return true;
}
bool InsertArc(MGraph&G,VexType u,VexType v,int w)
{
	int i,j;
	i=LocateVex(G,u);if(i==0)return false;
	j=LocateVex(G,v);
	if(j==0||j==i||G.arcs[i][j].adj!=Infinity)return false;
	G.arcs[i][j].adj=w;
	G.arcnum++;
	if(G.kind>=3)
	{
		G.arcs[j][i].adj=w;
	    G.arcnum++;
	}
	return true;
}
int LocateVex(MGraph&G,VexType v)
{
	int i;
	for(i=G.vexnum;i>0&&G.vexs[i].data!=v;i--);
	return i;
}
bool DeleteArc(MGraph& G,VexType u,VexType v)
{
	int i,j;
	i=LocateVex(G,u);if(i==0)return false;
	j=LocateVex(G,v);
	if(j==0||G.arcs[i][j].adj==Infinity)return false;
	G.arcs[i][j].adj=Infinity;
	G.arcnum--;
	if(G.kind>=3)
	{
		G.arcs[j][i].adj=Infinity;G.arcnum--;
	}
	return true;
}
bool DeleteVex(MGraph &G,VexType v)
{
	int i,j;
	j=LocateVex(G,v);
	G.vexs[j]=G.vexs[G.vexnum];
	for(i=1;i<=G.vexnum;i++)
	{
		if(G.arcs[i][j].adj!=Infinity)G.arcnum--;
		if(G.arcs[j][i].adj!=Infinity)G.arcnum--;
	}
	if(j<G.vexnum)
	{
		for(i=1;i<=G.vexnum;i++)
			G.arcs[i][j]=G.arcs[i][G.vexnum];
		for(i=1;i<=G.vexnum;i++)
			G.arcs[j][i]=G.arcs[i][G.vexnum];
	}
	G.vexnum--;
	return true;
}
void CreateGraph(MGraph&G,char fn[])
{
	int i,j,w;VexType u,v;ifstream f;
	f.open(fn);f>>G.kind;i=0;
	while(true)
	{
		f>>u;if(u=='#')break; i++;G.vexs[i].data=u;
	}
	G.vexnum=i;
	for(i=1;i<=G.vexnum;i++)
		for(j=1;j<=G.vexnum;j++) G.arcs[i][j].adj=Infinity;
	G.arcnum=0;
	while(true)//边
	{
		f>>u>>v;if(u=='#'||v=='#')break;
		if(G.kind==1||G.kind==3)
			w=1;
		else f>>w;
		InsertArc(G,u,v,w);
	}
	f.close();
}
void Show(MGraph &G)
{
	int i=1,j=1;
	cout<<"所有顶点为:";
	for(i;i<=G.vexnum;i++)
		cout<<G.vexs[i].data<<" ";
	cout<<endl<<"所有弧为:";
	if(G.kind==1)
	{
		for(i=1;i<=G.vexnum;i++)
			for(j=1;j<= G.vexnum;j++)
				if(G.arcs[i][j].adj==1)
					cout<<"<"<<G.vexs[i].data<<","<<G.vexs[j].data<<"> ";
	}
	else
	{
		for(i=1;i<=G.vexnum;i++)
			for(j=1;j<i;j++)
				if(G.arcs[i][j].adj==1)
					cout<<"("<<G.vexs[i].data<<","<<G.vexs[j].data<<") ";
	}
	cout << endl;
}

//fn.txt
1
a b c #
a b
b c
a c
# #


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...