数据结构>>>图形结构>>图的存储

图的存储:

  • 邻接矩阵
  • 领接表—主要是用于稀疏矩阵,为了避免直接用邻接矩阵而造成的浪费。

1.结构描述:

typedef struct 
{
	char vex[Maxsize];//邻接表的顶点数组
	int arcs[Maxsize][Maxsize];//邻接矩阵的数据数组
	int n;//边数
	int e;//顶点数
}AdjMat;//邻接矩阵的数据类型

typedef struct arcNode
{
	int adjvex;//存放邻接点的序号
    struct arcNode *next;//指向下一个邻接点的边结点
}ArcNode;//边结点的类型定义

typedef struct 
{
	char data;//存储顶点的名称
	ArcNode *adjNode;//指向顶点的第一个邻接点的边结点
}VexNode;//顶点结点类型定义

typedef struct
{
	VexNode vex[Maxsize];//顶点结点信息
	int n,e;//图的顶点数和弧数(有向路径)
}AdjLink;//图的邻接表数据类型

2.初始化邻接矩阵:

void Init_AdjMat(char vex[],int arcs[][5],AdjMat &g,int n)
{   int i,j;
    g.n=n;//确定邻接矩阵的边数
	strcpy(g.vex,vex);//将字符数组的内容复制到邻接矩阵中,从而确定其顶点数
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
			g.arcs[i][j]=arcs[i][j];//将二维数组的值放入邻接矩阵中
}

3.显示邻接矩阵:

void Show_AdjMat(AdjMat g)
{
   int i,j;
   for(i=0;i<g.n;i++){
	  for(j=0;j<g.n;j++)
		 cout<<g.arcs[i][j]<<"  ";
	  cout<<endl;
	  }
}

4.利用邻接矩阵的值来初始化邻接表(头插法创建邻接表):

void Init_AdjLink(AdjMat g,AdjLink &al)
{
	int i,j;
	ArcNode *an;
	al.n=g.n;//将邻接矩阵的边数赋值给邻接表
	for(i=0;i<g.n;i++)
	{
		al.vex[i].data=g.vex[i];
		al.vex[i].adjNode=NULL;
        for(j=0;j<g.n;j++)
		{
			if(g.arcs[i][j])
			{
               an=new ArcNode;
			   an->adjvex=j;
               an->next=al.vex[i].adjNode;
               al.vex[i].adjNode=an;
			}
		}
	}
}

5.显示邻接表:

void Show_AdjLink(AdjLink al)
{
	int i;
	ArcNode *an;
    for(i=0;i<al.n;i++)
	{
		cout<<al.vex[i].data<<"-->";
        an=al.vex[i].adjNode;
		while(an) 
		{
			cout<<an->adjvex<<"  ";
			an=an->next;
		}
		cout<<endl;
	}
}

------》源代码:

#include <iostream>
#include <string.h>
using namespace std;
#define Maxsize 10

//1.结构描述:

typedef struct 
{
	char vex[Maxsize];//邻接表的顶点数组
	int arcs[Maxsize][Maxsize];//邻接矩阵的数据数组
	int n;//边数
	int e;//顶点数
}AdjMat;//邻接矩阵的数据类型

typedef struct arcNode
{
	int adjvex;//存放邻接点的序号
    struct arcNode *next;//指向下一个邻接点的边结点
}ArcNode;//边结点的类型定义

typedef struct 
{
	char data;//存储顶点的名称
	ArcNode *adjNode;//指向顶点的第一个邻接点的边结点
}VexNode;//顶点结点类型定义

typedef struct
{
	VexNode vex[Maxsize];//顶点结点信息
	int n,e;//图的顶点数和弧数(有向路径)
}AdjLink;//图的邻接表数据类型

//2.初始化邻接矩阵:
void Init_AdjMat(char vex[],int arcs[][5],AdjMat &g,int n)
{   int i,j;
    g.n=n;//确定邻接矩阵的边数
	strcpy(g.vex,vex);//将字符数组的内容复制到邻接矩阵中,从而确定其顶点数
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
			g.arcs[i][j]=arcs[i][j];//将二维数组的值放入邻接矩阵中
}

//3.显示邻接矩阵:
void Show_AdjMat(AdjMat g)
{
   int i,j;
   for(i=0;i<g.n;i++){
	  for(j=0;j<g.n;j++)
		 cout<<g.arcs[i][j]<<"  ";
	  cout<<endl;
	  }
}

//4.利用邻接矩阵的值来初始化邻接表:
void Init_AdjLink(AdjMat g,AdjLink &al)
{
	int i,j;
	ArcNode *an;
	al.n=g.n;//将邻接矩阵的边数赋值给邻接表
	for(i=0;i<g.n;i++)
	{
		al.vex[i].data=g.vex[i];
		al.vex[i].adjNode=NULL;
        for(j=0;j<g.n;j++)
		{
			if(g.arcs[i][j])
			{
               an=new ArcNode;
			   an->adjvex=j;
               an->next=al.vex[i].adjNode;
               al.vex[i].adjNode=an;
			}
		}
	}
}

//5.显示邻接表:
void Show_AdjLink(AdjLink al)
{
	int i;
	ArcNode *an;
    for(i=0;i<al.n;i++)
	{
		cout<<al.vex[i].data<<"-->";
        an=al.vex[i].adjNode;
		while(an) 
		{
			cout<<an->adjvex<<"  ";
			an=an->next;
		}
		cout<<endl;
	}
}


void main()
{
	AdjMat g;
	AdjLink al;
    char vex[6]="abcde";
	int arc[5][5]={{0,1,0,1,0},{1,0,1,0,0},{0,1,0,1,1},	{0,0,1,0,1},{0,0,1,1,0}};
	Init_AdjMat(vex,arc,g,5); 
	Show_AdjMat(g);
    Init_AdjLink(g,al);
	Show_AdjLink(al);
}

图形结构是数据结构中最为复杂的一种结构,其难度要远胜于大多数算法类别,但凡要利用到图结构的算法也算是最复杂的设计了。

猜你喜欢

转载自blog.csdn.net/qq_43595030/article/details/90896563