一、邻接矩阵
1.图及其邻接矩阵
存储形式
#define MaxInt 32767//表示无穷
#define MaxNum 100//最大顶点数
typedef char VerTexType;//顶点的数据类型
typedef int ArcType;//边的权值数据类型
typedef struct{
VerTexType vexs[MaxNum];//顶点表
ArcType arcs[MaxNum][MaxNum];//邻接矩阵
}Graph;
2.以邻接矩方式创建无向图
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define OK 1
#define MaxInt 32767
#define MaxVNum 100
typedef char VerTexType;
typedef int ArcType;
typedef struct{
VerTexType Ver[MaxVNum];//顶点表
ArcType arcs[MaxVNum][MaxVNum];//邻接矩阵
int vernum,arcnum; //当前顶点数和边数
}Graph;
int LocateVer(Graph G,VerTexType ch)
{
for(int i = 0;i< G.vernum;i++)
{
if(G.Ver[i] == ch) return i;
}
}
int Creat_Graph(Graph &G){
cin>>G.vernum>>G.arcnum;//输入总的顶点数和边数;
for(int i = 0;i< G.vernum;i++)
{
for(int j = 1;j< G.arcnum;j++)
{
G.arcs[i][j] = MaxInt;
}
}
for(int i = 0;i< G.arcnum;i++)//构造邻接矩阵,按照边的多少来输入;
{
VerTexType v1,v2;
int w;
cin>>v1>>v2>>w;//输入边的两个点的名字和这条边的权值
int num1 = LocateVer(G,v1);//找到这两个点所在的位置,即顶点表的下标
int num2 = LocateVer(G,v2);
G.arcs[num1][num2] = w;//边<num1,num2>的权值w
G.arcs[num2][num1] = G.arcs[num1][num2] ;//因为是无向图,权值一样,如果为有向的则没有这一句
}
return OK;
}
int main()
{
Graph G;
Creat_Graph(G);
return 0;
}
二、邻接表
1.使用邻接表存储图需要
1)表头结点表:用来存储所有的顶点,通常用顺序结构存储
data:来存放顶点数据
firstarc:链域用于指向下一个结点
2)边表:
adjvex:与顶点v相邻的点在表头结点表中的位置
info:存储例如边的权值等其他信息
nextarc:顶点v下一个相邻的结点
存储结构:
#define MVNum 100//最大顶点数
//边结点
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
OtherInfo info;
}ArcNode;
//顶点信息
typedef struct VNode{
VerTexType data;
ArcNode *firxtarc;//指向第一条依附该顶点的边的指针
}VNode,AdjList[MVNum];//AdjList 表示邻接表类型
//图
typedef struct{
AdjList vertices;
int vexnum,arcnum;
}Graph;
2.以邻接表创建无向图
#include <iostream>
#include <cstdio>
#include <cstring>
#define OK 1
#define ERROR 0
#define MaxNum 100
using namespace std;
typedef int OtherInfo;
typedef char VexName;
//vertics 顶点,最高点;adjective 相邻的
//邻接点
typedef struct ArcNode{
int FirstVex;//前一个节点的序号
struct ArcNode *nextVex;//指向下一个边节点
OtherInfo info;//每一个节点存储的其他信息,比如边的权值
}ArcNode;
//顶点
typedef struct VexNode{
VexName data;//节点的名字
ArcNode *FirstArcNode;//顶点的第一个相邻节点
}VexNode,MapSqList[MaxNum];//直接用typedef一个结构体数组,
typedef struct{
MapSqList vertics;//存储顶点的顺序表
int vexnum,arcnum;//当前的点数和边数
}ArcGraph;
int LocateVex(ArcGraph G,VexName v)
{
for(int i = 0;i<G.vexnum;i++)
{
if(G.vertics[i].data == v) return i;
}
}
void Creat_Graph(ArcGraph G)
{
cin>>G.vexnum>>G.arcnum;
for(int i= 1;i<=G.vexnum;i++)
{
cin>>G.vertics[i].data;
G.vertics[i].FirstArcNode = NULL;
}
for(int i =0;i<G.arcnum;i++)
{
VexName v1,v2;
cin>>v1>>v2;
int OredrNumber1,OredrNumber2;
//确定v1,v2在图G中的位置,实际就是 vertics数组的序号;
OredrNumber1 = LocateVex(G,v1);
OredrNumber2 = LocateVex(G,v2);
ArcNode *p1 = new ArcNode;
ArcNode *p2 = new ArcNode;
//将邻接点插入到边表
p1->FirstVex = OredrNumber1;
p1->nextVex = G.vertics[OredrNumber1].FirstArcNode;
G.vertics[OredrNumber1].FirstArcNode = p1;
//因为是无向图需要插入两次
p2->FirstVex = OredrNumber2;
p2->nextVex = G.vertics[OredrNumber2].FirstArcNode;
G.vertics[OredrNumber2].FirstArcNode = p2;
}
}
int main()
{
ArcGraph G;
Creat_Graph(G) ;
return 0;
}