图的存储:
- 邻接矩阵
- 领接表—主要是用于稀疏矩阵,为了避免直接用邻接矩阵而造成的浪费。
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);
}
图形结构是数据结构中最为复杂的一种结构,其难度要远胜于大多数算法类别,但凡要利用到图结构的算法也算是最复杂的设计了。