数据结构,图的邻接矩阵创建,邻接矩阵与邻接表的交换,两种表的输出,过程用C++实现

原创 2013年12月01日 23:11:44
/*
编写一个程序algo8-1.cpp,实现不带权图和带权图的邻接矩阵与邻接表的互相
转换算法、输出邻接矩阵与邻接表的算法,并在此基础上设计一个程序exp8-1.cpp
实现如下功能:
1)建立如图有向图G的邻接矩阵,并输出;
2)由有向图G的邻接矩阵产生邻接表,并输出;
3)再由2)邻接表产生对应的邻接矩阵,并输出。
*/


#include<iostream>
#define MAX 6
using namespace std;

class VertexType	//顶点类型
{
public:
	int no;		//顶点编号
	char info;	
};

class MGraph
{
public:
	int edges[MAX][MAX];	//邻接矩阵的变数组,使用int类型记录,主要记录为0、1,带权的则为其权值
	int n,e;				//	顶点数,边数
	VertexType vexs[MAX];	//存放顶点信息
	MGraph():n(0),e(0){
		for	(int x = 0 ; x < MAX ; x++)
			for(int y = 0 ; y < MAX ; y ++)
				edges[x][y] = 0;
		for (int i =0; i < MAX; i++)
			this ->vexs[i].info = -1;
	}
};//	完整的图邻接矩阵类型

class ArcNode
{
public:
	ArcNode():adjvex(0),nextarc(NULL){}
	int adjvex;		//该边的终点编号
	ArcNode * nextarc;
	char info;		//边的信息
};

class VNode		//起点信息
{
public :
	VNode():data(0),firstarc(NULL){}
	void Reset()
	{
		adjvex = -1;
		data = 0;
		firstarc = NULL;
	}
	int adjvex;
	char data;		//起点信息
	ArcNode * firstarc;
};

typedef VNode AdjList[MAX]	;	//eg:"typedef char Line[81];      //Line是char[81]    (而不是说char是line[81])"

class ALGraph
{
public:
	ALGraph():n (0),e (0){				//邻接表初始化
		for(int i = 0;i < MAX ; i ++)
			adjlist[i].Reset();
	}
	AdjList adjlist;
	int n,e;
};					//完整的图邻接表的类型

void CreatMGraph(MGraph * G)		//图的构造函数,不带权带向
{
	cout << "输入图的顶点个数: ";
	cin >> G ->n ;
	cout << "输入图的边数:";
	cin >> G ->e ;

	int x,y;
	for(x = 0 ; x < G ->n ; x++)
		for ( y = 0 ; y < G ->n ; y++)
			G->edges[x][y] = 0;			//默认设定为 0

	for (int i = 0 ; i < G ->e ; i++)
	{
		int weight; // 权值
		cout << "请输入第" << (i+1) << "条边的前后节点。"  << endl;
		cout << "出发点:" ;
		cin >> x;
		cout << "接收点:" ;
		cin >> y;
	/*	cout << "输入权值:";
		cin >> weight;*/
		G ->edges[x][y] = 1;
	}
}

void OutputMGraph(MGraph * G)
{
	cout << "----------现在输出邻接矩阵------------" << endl; 
	for(int i = 0 ; i < G ->n ; i ++)
	{
		for (int j = 0 ; j < G ->n ; j ++)
			cout << G ->edges[i][j] << "    " ;
		cout << endl;
	}
	cout << "--------------------------------------" <<endl;	
}

void OutputALGraph(ALGraph * G)		//输出邻接表
{
	cout << "--------------现在输出邻接表---------------" << endl;
	for(int i = 0; i < G ->n ; i ++)
	{
		if(G ->adjlist[i].adjvex  == -1)	break;		//不存在顶点时退出循环
		cout << G ->adjlist[i].adjvex ;
		while(G ->adjlist [i].firstarc != NULL)
		{
			ArcNode * temp = G ->adjlist[i].firstarc;
			while(temp != NULL)
			{
				cout << "---->" << temp->adjvex;
				if(temp ->nextarc == NULL)	break;
				temp = temp ->nextarc;
			}if(temp ->nextarc == NULL) break;	//再跳出
		}
		cout << endl;
	}
	cout << "---------------邻接表输出结束---------------" << endl;
}

void MatToList(MGraph * g,ALGraph *&G)
{
	ArcNode * p;
	G = new ALGraph();
	for(int i = 0; i < g ->n ;i ++)		//初始化邻接表,使其写上顶点编号
		G ->adjlist[i].adjvex = i;		//	0 1 2 3 4 5	,n的值应该为6
	for(int i = 0;i < g ->n;i++)
		for(int j = 0; j < g ->n;j++)
			if(g ->edges[i][j] != 0)			//不带权的有向或无向邻接矩阵转邻接表
			{	p = new ArcNode();
				p ->adjvex = j;
				p ->nextarc = G ->adjlist[i].firstarc;
				G ->adjlist[i].firstarc = p;
			}
		
	G ->n = g ->n;
	G ->e = g ->e;
}

void ListToMat(ALGraph * g,MGraph * &G)		//邻接表转邻接矩阵
{
	int i;
	ArcNode * p;
	for( i =0; i< g ->n;i++)
	{
		p = g ->adjlist[i].firstarc;
		while(p != NULL)
		{
			G ->edges[i][p ->adjvex] = 1;
			p = p ->nextarc;
		}
	}
	G ->e = g ->e;
	G ->n = g ->n;
}


int main()
{
	MGraph * G = new MGraph();
	CreatMGraph(G);
	OutputMGraph(G);

	ALGraph * J;
	MatToList(G,J);
	OutputALGraph(J);

	MGraph * g = new MGraph();
	ListToMat(J,g);
	OutputMGraph(g);


	return 0;

}


邻接矩阵创建图

邻接矩阵:        图的邻接矩阵是表示顶点间相邻关系的矩阵,是顺序存储结构,故也称为数组表示法。它采用两个数组分别来存储图的顶点和边(或弧)的信息。其中,用一个一位数组来存储顶点信息,一个二维数...
  • zhaishaojiang
  • zhaishaojiang
  • 2014年11月30日 19:13
  • 2236

数据结构:不带权有向图的邻接矩阵和邻接表储存及求出入度实现

14.假设不带权有向图采用邻接矩阵G存储,设计实现以下功能的算法。 (1) 求出图中每个顶点的入度。 (2)求出图中每个顶点的出度。 (3)求出图中出度为0的顶点数。 15. 假设不带权有向图...
  • qq_39805477
  • qq_39805477
  • 2017年11月28日 23:19
  • 731

数据结构图的邻接矩阵,邻接表存储表示,图的深度优先搜索遍历,广度优先搜索遍历

  • 2010年06月17日 21:58
  • 2KB
  • 下载

数据结构基础 之 图 的 邻接矩阵实现与邻接表实现

首先,本文给出邻接表与邻接矩阵的概念,然后,对相关概念进行阐释并给出实现源码,最后,对两种方法进行了比较分析给出给进一步的改进方向。...
  • u013630349
  • u013630349
  • 2015年07月11日 15:54
  • 1336

图的遍历与输出 (邻接矩阵和邻接表)

#include #include #include "graph.h" using namespace std; int main() { freopen("data.in" , "...
  • S2637281620
  • S2637281620
  • 2016年12月05日 18:15
  • 1612

无向图的建立和邻接矩阵的输出

  • 2011年07月05日 15:17
  • 3KB
  • 下载

无向图的表示:邻接矩阵和邻接表

这里将一个无向图用邻接表和邻接矩阵表示。 输入:顶底个数n,图中的各个边(用两个顶点表示)。 输出:这个无线图的邻接矩阵和邻接表,其中邻接表中的链接按元素大小升序排列。 先给出一个例子说明。假设...
  • x_i_y_u_e
  • x_i_y_u_e
  • 2015年06月14日 06:01
  • 5388

c语言编程 输出一个无向图的邻接表,邻接矩阵,进行深度和广度优先遍历

#include #include #include #include #define MAXVERTEX 10 //最大顶点数 typedef struct ArcNode //表结...
  • liuzhuchen
  • liuzhuchen
  • 2014年03月19日 23:42
  • 4407

数据结构 用邻接矩阵表示图

  • 2009年11月27日 09:24
  • 4KB
  • 下载

图的邻接矩阵数据结构代码实现

邻接矩阵(Adjacency Matrix)是表示顶点之间相邻关系的矩阵。设G=(V,E)是一个图,其中V={v1,v2,…,vn}[1]  。G的邻接矩阵是一个具有下列性质的n阶方阵: ①对无...
  • printf88
  • printf88
  • 2017年10月12日 22:41
  • 303
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构,图的邻接矩阵创建,邻接矩阵与邻接表的交换,两种表的输出,过程用C++实现
举报原因:
原因补充:

(最多只允许输入30个字)