图的存储结构

(一)邻接矩阵

1.无向图的邻接矩阵

 

 2.有向图邻接矩阵

3.网(有权图)的邻接矩阵 

4.

/*图的邻接矩阵存储表示法*/
//用两个数组分别存储顶点表和邻接矩阵
#define MaxInt 32767  //表示极大值,即无穷
#define MVNum 100  //最大顶点数
typedef char VerTexType;  //假设顶点的数据类型为字符型
typedef int ArcType;	//假设边的权值类型为整型
typedef struct
{
	VerTexType vexs[MVNum];	//顶点表
	ArcType arcs[MVNum][MVNum];	//邻接矩阵
	int vexnum, arcnum;	//图的当前顶点数和边数
}AMGraph;

 5.采用邻接矩阵表示法创建无向网

【算法步骤】
1、输入总顶点数和边数
2、依次输入点的信息存入到顶点表中
3、初始化邻接矩阵,使每个权值初始化为极大值
4、构造邻接矩阵

注意:
1、无向图需要为arcs[i][j]和arcs[j][i]赋值
2、有向图仅需为arcs[i][j]赋值

/*采用邻接矩阵表示法创建无向网*/
Status CreateUDN(AMGraph& G)
{
	cin >> G.vexnum >> G.arcnum;//输入总顶点数和总边数
	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] = MaxInt;
	for (int k = 0;k < G.arcnum;++k)
	{
		cin >> v1 >> v2 >> w;//输入一条边依附的顶点和权值
		i = LocateVex(G, v1);j = LocateVex(G, v2);//确定两个顶点v1和v2在G中的位置
		G.arcs[i][j] = w;//边<v1,v2>的权值置为w
		G.arcs[j][i] = G.arcs[i][j];//置边<v1,v2>的对称点<v2,v1>的权值也为w
	}
	return OK;
}
/*在图中查找顶点的位置LocateVex()函数*/
int LocateVex(AMGraph G, VertexType u)
{//若在图中找到这个元素,则返回它的下标i,否则返回-1
	int i;
	for (i = 0;i < G.vexnum;++i)
		if (u == G.vexs[i])
			return i;
	return -1;
}

(二)邻接表(链式)表示法

 1.无向图的邻接表表示

 2.有向图的邻接表表示

 代码分三部分

1.图的结构定义

2.顶点的头结点结构

3.边的节点结构

/*图的邻接表的存储定义*/
//弧的结点结构
#define MVNum 100	//最大的顶点数
typedef struct ArcNode
{
	int adjvex;	//该边所指的顶点的位置
	struct ArcNode* nextarc;	//指向下一条边的指针
	OtherInfo info;	//和边相关的信息
}ArcNode;
//顶点的结点结构
typedef struct VNode
{
	VertexType data;//顶点信息
	ArcNode* firstarc;//指向第一条依附该顶点的边
}VNode,AdjList[MVNum];//AdjList表示邻接表类型
//AdjList v相当于VNode v[MVNum]

//图的结构定义(邻接表)
typedef struct
{
	AdjList vertices;//vertices是vertex的复数
	int vexnum, arcnum;//图的当前顶点数和边数
}ALGraph;

/*说明*/
ALGraph G;//定义了邻接表表示的图G
G.vexnum = 5;G.arcnum = 6;//图G包含了5个顶点和6条边
G.vertices[1].data = 'v2';//图G中第2个顶点是v2
p = G.vertices[1].firstarc;//指针p指向顶点v2的第一个边结点
p->adjvex = 4;//p指针所指边结点是到下标为4的结点的边

4.采用邻接表表示法创建无向网

【算法步骤】
1、输入总顶点数和总边数
2、建立顶点表

1、依次输入点的信息存入顶点表中
2、使每个表头结点的指针域初始化为NULL

3、创建邻接表

1、依次输入每条边依附的两个顶点
2、确定这两个顶点的序号i和j
3、将此边结点分别插入vi和vj对应的两个边链表的头部
 

/*采用邻接表表示法创建无向图*/
Status CreateUDG(ALGraph& G)
{//采用邻接表表示法,创建无向图G
	cin >> G.vexnum >> G.arcnum;//输入顶点数和弧数
	for (int i = 0;i < G.vexnum;++i)
	{
		cin >> G.vertices[i].data;//输入顶点值
		G.vertices[i].firstarc = NULL;//初始化表头结点的指针域为NULL
	}
	for (int k = 0;k < G.arcnum;++k)//输入各边,构造邻接表,头插法
	{
		cin >> v1 >> v2;//输入一条边依附的两个顶点
		i = LocateVex(G, v1);j = LocateVex(G.v2);
		p1 = new ArcNode;//生成一个新的边结点*p1
		p1->adjvex = j;//邻结点序号为j
		p1->nextarc = G.vertices[i].firstarc;//firstarc为空,所以nextarc也指向空,即最后的一个结点
		G.vertices[i].firstarc = p1;//将新结点*p1插入到顶点vi的边表头部
		p2 = new ArcNode;//生成一个新的边结点*p2
		p2->adjvex = i;
		p2->nextarc = G.vertices[j].firstarc;//插入弧结点到单链表
		G.vertices[j].firstarc = p2;//将新结点*p2插入到顶点vi的边表头部
	}//头插法
		return OK;
}

5.邻接矩阵与邻接表的比较

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值