1:概念
邻接矩阵:就是一个一维数组存储图中订单顶点的信息, 用一个二维数组存储图中边的信息,存储顶点之间邻接关系的二维数组称为邻接矩阵。
矩阵元素为:
邻接表:对图中每个顶点Vi简历一个单链表,第i个单链表中的节点表示依附于顶点Vi的边,这个单链表就称为顶点Vi的边表。边表的头指针和顶点和顶点的数据信息采用顺序存储,所以在邻接表中存在两种节点:顶点表节点和边表节点。如下图:
2:数据准备
邻接表:
邻接矩阵:
有向图:
3:图的创建与遍历(邻接表+深度优先+递归算法)
#include
#include
#define MAX_VERTEX_NUM 4 //顶点数
typedef int VertexType; //顶点数据类型
typedef struct ArcNode{ //弧(边)所指顶点——3
int adjvex; //相连边顶点的位置(序号)
struct ArcNode *nextarc; //指向下一个弧结点的指针
//int info; //该弧的权值,比链表多一个分量(权值)
}ArcNode; //定义弧结点类型,用于创建邻接表里的单链表
typedef struct{ //定义顶点类型——2
VertexType data; //顶点数据域
ArcNode *firstarc; //指向顶点第一条边的顶点的指针
}VNode;
typedef struct{
VNode adjlist[MAX_VERTEX_NUM]; //顶点集数组——1,即图由若干顶点组成
//int vexnum, arcnum; //顶点数及弧数
}ALGraph; // 定义图类型
int visited[MAX_VERTEX_NUM]; //记录该顶点是否访问过
void DFS(ALGraph G, int v){ //图G从顶点v开始的深度优先搜索
ArcNode *p;
printf("%5d",G.adjlist[v].data); //访问顶点v的数据域
visited[v]=1; //标记顶点v已访问
p=G.adjlist[v].firstarc; //取顶点v首边结点的头指针,深度优先
while(p){
if (!visited[p->adjvex])
DFS(G,p->adjvex); //递归
p=p->nextarc; //下一个邻接点
}
}
int main(){
ALGraph g;
//邻接表创建开始
g.adjlist[0].data=1; //设置图的顶点集数组
g.adjlist[1].data=2;
g.adjlist[2].data=3;
g.adjlist[3].data=4;
//g.vexnum = 4; //g.arcnum = 5; //设置图的顶点数及狐数,未使用
//邻接表是对邻接矩阵的改进,将邻接矩阵中非零的边(狐)连接起来构成单链表(节省空间),
//同一顶点相关联的边在同一链表里
ArcNode *arc,*p; //arc和p都是指向边结点的指针,p用于循环
//ArcNode *arc = NULL, *p = NULL;
arc = (ArcNode *)malloc (sizeof (ArcNode));
arc->adjvex = 1; //相连边顶点的位置(序号)
//arc->nextarc = NULL;
//arc->info = 0;
g.adjlist[0].firstarc = arc; //顶点1的首边指针(地址)
p = arc; //保存当前结点地址,为新建结做点准备
arc = (ArcNode *)malloc (sizeof (ArcNode));
arc->adjvex = 2;
//arc->nextarc = NULL;
//arc->info = 0;
p->nextarc = arc; //顶点1的第2条边指针
p = arc;
arc = (ArcNode *)malloc (sizeof (ArcNode));
arc->adjvex = 3;
arc->nextarc = NULL; //不可省略
//arc->info = 0;
p->nextarc = arc; //顶点1的第3条边
//
arc = (ArcNode *)malloc (sizeof (ArcNode)); //处理顶点2,方法如上
arc->adjvex = 0;
arc->nextarc = NULL;
//arc->info = 0;
g.adjlist[1].firstarc = arc;
p = arc;
arc = (ArcNode *)malloc (sizeof (ArcNode));
arc->adjvex = 2;
//arc->nextarc = NULL;
//arc->info = 0;
p->nextarc = arc;
p = arc;
arc = (ArcNode *)malloc (sizeof (ArcNode));
arc->adjvex = 3;
arc->nextarc = NULL;
//arc->info = 0;
p->nextarc = arc;
/
arc = (ArcNode *)malloc (sizeof (ArcNode)); //处理顶点3,方法如上
arc->adjvex = 0;
//arc->nextarc = NULL;
//arc->info = 0;
g.adjlist[2].firstarc = arc;
p = arc;
arc = (ArcNode *)malloc (sizeof (ArcNode));
arc->adjvex = 1;
arc->nextarc = NULL;
//arc->info = 0;
p->nextarc = arc;
/
arc = (ArcNode *)malloc (sizeof (ArcNode)); //处理顶点4,方法如上
arc->adjvex = 0;
//arc->nextarc = NULL;
//arc->info = 0;
g.adjlist[3].firstarc = arc;
p = arc;
arc = (ArcNode *)malloc (sizeof (ArcNode));
arc->adjvex = 1;
arc->nextarc = NULL;
//arc->info = 0;
p->nextarc = arc; //邻接表创建完毕
DFS (g, 3); //深度搜索,第2参数取值可以是0-3
return 0;
}
4:图的创建与遍历(邻接矩阵+深度优先+递归算法)
/*
*对使用邻接矩阵表示的图进行深度优先遍历的递归算法
*/
#include
#define MAX_VERTEX_NUM 4 //顶点数
typedef int VertexType; //顶点数据类型
typedef struct{
VertexType v[MAX_VERTEX_NUM]; //顶点集数组
int A[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //邻接矩阵
//int vexnum, arcnum; //顶点数及弧数
}MGraph;
int visited[MAX_VERTEX_NUM]; //记录该顶点是否访问过
int DFS(MGraph G, int s){ //从图G的顶点s开始的深度优先搜索
int p = 0;
printf("%5d",G.v[s]);
visited[s]=1; //标记顶点s已被访问
for (p=0;p
if (!visited[p] && G.A[s][p]==1){
DFS(G,p); //递归
}
}
//for (;p
}
int main(){
MGraph g;
g.v[0]=1; //顶点集
g.v[1]=2;
g.v[2]=3;
g.v[3]=4;
g.A[0][0]=0;g.A[0][1]=1;g.A[0][2]=1;g.A[0][3]=1; //邻接矩阵
g.A[1][0]=1;g.A[1][1]=0;g.A[1][2]=1;g.A[1][3]=1;
g.A[2][0]=1;g.A[2][1]=1;g.A[2][2]=0;g.A[2][3]=0;
g.A[3][0]=1;g.A[3][1]=1;g.A[3][2]=0;g.A[3][3]=0;
//设置图的顶点数及狐数
//g.vexnum = 4;g.arcnum = 5; //暂时未用
DFS (g, 2); //深度优先搜索
return 0;
}
5:输出结果
a.当顶点为数组下标0时,则输出1 2 3 4
b.当顶点为数组下标1时,则输出2 1 3 4
c.当顶点为数组下标2时,则输出3 1 2 4
d.当顶点为数组下标3时,则输出4 1 2 3