c++数据结构表的两种表示方法邻接矩阵和邻接表

图的应用

图是一种比线性表和树更为复杂的数据结构。在图结构中,节点之间的关系可以是任意的图中任意两个数据元素之间都可能相关。由此,图的应用极为广泛,已渗入到诸如物理,化学,电信工程,计算机科学,以及数学等其他分支中。在离散数学中,图论是专门研究图的性质的数学分支,而在数据结构中,则应用图论的知识讨论如何在计算机上实现图的操作,因此主要学习图的存储结构,以及若干图的操作的实现。

图的组成部分

  • 顶点
  • 边(分为有向边和无向边)

图的存储结构

  • 邻接表
  • 邻接矩阵

邻接矩阵

  • 邻接矩阵的数据结构
typedef struct
{
	char vexs[100];//顶点表
	int arcs[100][100];//邻接矩阵
	int vexnum, arcnum;//点数和边数
}AMGraph;
  • 邻接矩阵的完整代码(无向表);
#include
using namespace std;//无向邻接矩阵
typedef struct
{
	char vexs[100];//顶点表
	int arcs[100][100];//邻接矩阵
	int vexnum, arcnum;//点数和边数
}AMGraph;
int LocateVex(AMGraph &G, int v)
{
	return v;
}
void print(AMGraph &G)//输出邻接矩阵
{
	int i,j;
	for (i = 1; i <= G.vexnum; i++)
	{
		for (j = 1; j <= G.vexnum; j++)
		{
			cout << G.arcs[i][j] << " ";
		}
		cout << endl;
	}
 }
void createUDN(AMGraph &G)
{
	int i,j,k;
	int v1, v2,w;
	cout << "输入点数和边数";
	cin >> G.vexnum >> G.arcnum;//点数和边数
	//*for (i = 0; i < G.vexnum; i++)//输入点的信息
//	{
//		cin >> G.vexs[i];//这里默认为点用数字表示也可以自己设置
//	}
	for (i = 1; i <= G.vexnum; i++)
	{
		for (j = 1; j <= G.vexnum; j++)
		{
			 G.arcs[i][j]=1;//初始化邻接矩阵
		}
	}
	for (k = 1; k <= G.arcnum; k++)
	{
		cin >> v1 >> v2 ;//输入一条边依附的顶点及权值
		w = 0;//权值设为0//这里设为0也可以自己设置
		i = LocateVex(G, v1);
		j = LocateVex(G, v2);//获取点在表中的位置
		G.arcs[i][j] = w;
		G.arcs[j][i] = G.arcs[i][j];
		G.arcs[v1][v1] = 0;
		G.arcs[v2][v2] = 0;
	}
}
int main()
{
	AMGraph G;
	createUDN(G);
	print(G);//输出邻接表
	system("pause");
	return 0;
}
  • 运行结果演示
    c++数据结构表的两种表示方法邻接矩阵和邻接表_第1张图片
    其中第一行的4 4表示点数和边数
    后边的表示第一个点和第二个点,第二个点和第三个点,第三个点和第四个点,第四个点和第一个点有联系!
    输出结果中第一行代表第一个点如【1,1】【1,2】,【1,4】中0代表通1代表不通;所以第一行代表第一个点和第二个点第四个点有通路;
    表示的图就是
    c++数据结构表的两种表示方法邻接矩阵和邻接表_第2张图片

邻接表(无向图)

  • 邻接表的数据结构
typedef struct ArcNode
{
	int adjvex;//该边所指向的顶点的位置
	struct ArcNode * nextarc;
}ArcNode;
typedef struct VNode
{
	char data;
	ArcNode *firstarc;
}VNode,AdjList[100];
typedef struct
{
	AdjList vertices;
	int vexnum, arcnum;//顶点数和边数
}ALGraph;
  • 邻接表的完整代码
#include
using namespace std;
typedef struct ArcNode
{
	int adjvex;//该边所指向的顶点的位置
	struct ArcNode * nextarc;
}ArcNode;
typedef struct VNode
{
	char data;
	ArcNode *firstarc;
}VNode,AdjList[100];
typedef struct
{
	AdjList vertices;
	int vexnum, arcnum;//顶点数和边数
}ALGraph;
int LocateVex(ALGraph G, int v)
{
	return v;
}
void print(ALGraph G)
{
	int i;
	for (i = 1; i <= G.vexnum;i++)
	{
		cout << G.vertices[i].data<<" ";
		while (G.vertices[i].firstarc != NULL)
		{
			cout << G.vertices[i].firstarc->adjvex<<" ";
			G.vertices[i].firstarc = G.vertices[i].firstarc->nextarc;
		}
		cout << endl;
	}
}
void CreateUDG(ALGraph &G)
{
	int i,j,k;
	cout << "输入顶点数和边数" << endl;
	cin >> G.vexnum >> G.arcnum;//输入顶点数和边数
	cout << "输入每个顶点" << endl;
	for (i = 1; i <= G.vexnum; i++)
	{
		cin >> G.vertices[i].data;//输入顶点
		G.vertices[i].firstarc = NULL;//
	}
	for (k = 1; k <= G.arcnum; k++)
	{
		cout << "输入第" << k << "条边的两个顶点" << endl;
		int v1, v2;//输入一条边的两个顶点
		cin >> v1 >> v2;
		i = LocateVex(G, v1);
		j = LocateVex(G, v2);
		ArcNode *p1 = new ArcNode;//头插法把两个顶点插进去;
		p1->adjvex = j;
		p1->nextarc = G.vertices[i].firstarc;//把j插到i后面
		G.vertices[i].firstarc = p1;
		ArcNode *p2 = new ArcNode;
		p2->adjvex = i;
		p2->nextarc = G.vertices[j].firstarc;//把i插到j后面
		G.vertices[j].firstarc = p2;
	}
}
int main()
{
	ALGraph G;
	CreateUDG(G);
	  print(G);
	system("pause");
	return 0;
} 
  • 运行结果演示
    c++数据结构表的两种表示方法邻接矩阵和邻接表_第3张图片
    邻接表的思想和邻接矩阵类似,在邻接表里若有路则直接把通向的点添加到点后面!
    输出结果中1 4 2 代表第一个点和第4个点第二个点有通路 !

你可能感兴趣的:(c++数据结构)