/**********
【题目】编写算法,创建有向图的邻接数组存储结构。
图的邻接数组存储结构的类型定义如下:
#define UNVISITED 0
#define VISITED 1
#define MAX_VEX_NUM 4
#define INFINITY MAXINT // 计算机允许的整数最大值,即∞
typedef int VRType;
typedef char InfoType;
typedef char VexType;
typedef enum {DG,DN,UDG,UDN} GraphKind; // 有向图,有向网,无向图,无向网
typedef struct {
VRType adj; // 顶点关系类型。对无权图,用1(是)或0(否)表示相邻否;
// 对带权图,则为权值类型
InfoType *info; // 该弧相关信息的指针(可无)
}ArcCell;//,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct {
ArcCell arcs[MAX_VEX_NUM][MAX_VEX_NUM]; // 关系数组
VexType vexs[MAX_VEX_NUM]; // 顶点数组
int n, e; // 顶点数和边(弧)数
GraphKind kind; // 图的类型
} MGraph; // 邻接数组类型
typedef struct {
VexType v, w;
int inf;
} ArcInfo;
可调用以下基本操作:
Status InitGraph(MGraph &G, GraphKind kind, int n);
// 初始化含n个顶点空间的kind类的空图G
int LocateVex(MGraph G, VexType v); // 查找顶点v在图G中的位序
**********/
Status CreateDG(MGraph &G, VexType *vexs, int n,
ArcInfo *arcs, int e)
/* 创建含n个顶点和e条边的有向图G,vexs为顶点信息,arcs为边信息 */
{
if (InitGraph(G, DG, n) != OK) return ERROR;
int i, j, k;
VexType v, w;
G.e = e;
G.n = n;
for (k = 0; k < G.n; k++) G.vexs[k] = vexs[k];
for (k = 0; k < G.e; k++) {
v = arcs[k].v;
w = arcs[k].w;
i = LocateVex(G, v);
j = LocateVex(G, w);
if (i<0 || j<0) return ERROR;
G.arcs[i][j].adj = 1;
}
return OK;
}
/**********
【题目】编写算法,在图G中,相对于k顶点的当前
邻接顶点m顶点,求下一个邻接顶点。
图的邻接数组存储结构的类型定义如下:
#define UNVISITED 0
#define VISITED 1
#define MAX_VEX_NUM 4
#define INFINITY MAXINT // 计算机允许的整数最大值,即∞
typedef int VRType;
typedef char InfoType;
typedef char VexType;
typedef enum {DG,DN,UDG,UDN} GraphKind; // 有向图,有向网,无向图,无向网
typedef struct {
VRType adj; // 顶点关系类型。对无权图,用1(是)或0(否)表示相邻否;
// 对带权图,则为权值类型
InfoType *info; // 该弧相关信息的指针(可无)
}ArcCell;//,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct {
ArcCell arcs[MAX_VEX_NUM][MAX_VEX_NUM]; // 关系数组
VexType vexs[MAX_VEX_NUM]; // 顶点数组
int n, e; // 顶点数和边(弧)数
GraphKind kind; // 图的类型
} MGraph; // 邻接数组类型
**********/
int NextAdjVex(MGraph G, int k, int m)
/* 在图G中,相对于k顶点的当前邻接顶点m顶点,求下一个邻接顶点 */
{
if (k<0 || k>G.n) return -1;
if(!G.n || !G.e) return 0;
int i, next = -1;
for (i = m+1; i < G.n; i++) {
if (G.arcs[k][i].adj) {
next = i;
break;
}
}
return next;
}
/**********
【题目】编写算法,在图G中置顶点v到顶点w的弧或边。
图的邻接数组存储结构的类型定义如下:
#define UNVISITED 0
#define VISITED 1
#define MAX_VEX_NUM 4
#define INFINITY MAXINT // 计算机允许的整数最大值,即∞
typedef int VRType;
typedef char InfoType;
typedef char VexType;
typedef enum {DG,DN,UDG,UDN} GraphKind; // 有向图,有向网,无向图,无向网
typedef struct {
VRType adj; // 顶点关系类型。对无权图,用1(是)或0(否)表示相邻否;
// 对带权图,则为权值类型
InfoType *info; // 该弧相关信息的指针(可无)
}ArcCell;//,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct {
ArcCell arcs[MAX_VEX_NUM][MAX_VEX_NUM]; // 关系数组
VexType vexs[MAX_VEX_NUM]; // 顶点数组
int n, e; // 顶点数和边(弧)数
GraphKind kind; // 图的类型
} MGraph; // 邻接数组类型
可调用以下基本操作:
int LocateVex(MGraph G, VexType v); // 查找顶点v在图G中的位序
**********/
Status SetArc(MGraph &G, VexType v, VexType w, ArcCell info)
/* 在图G中置顶点v到顶点w的弧或边 */
{
int i, j;
i = LocateVex(G, v);
j = LocateVex(G, w);
if (i<0 || j<0 || i==j) return ERROR;
if (!G.arcs[i][j].adj) G.e++;
G.arcs[i][j] = info;
return OK;
}
/**********
【题目】编写算法,计算以邻接表方式存储的有向图G中k顶点的出度。
图的邻接表存储结构的类型定义如下:
#define UNVISITED 0
#define VISITED 1
#define INFINITY MAXINT // 计算机允许的整数最大值,即∞
typedef char VexType;
typedef enum {DG,DN,UDG,UDN} GraphKind; // 有向图,有向网,无向图,无向网
typedef struct AdjVexNode {
int adjvex; // 邻接顶点在顶点数组中的位序
struct AdjVexNode *next; // 指向下一个邻接顶点(下一条边或弧)
int info; // 存储边(弧)相关信息,对于非带权图可不用
} AdjVexNode, *AdjVexNodeP; // 邻接链表的结点类型
typedef struct VexNode {
VexType data; // 顶点值,VexType是顶点类型,由用户定义
struct AdjVexNode *firstArc; // 邻接链表的头指针
} VexNode; // 顶点数组的元素类型
typedef struct {
VexNode *vexs; // 顶点数组,用于存储顶点信息
int n, e; // 顶点数和边(弧)数
GraphKind kind; // 图的类型
int *tags; // 标志数组
} ALGraph; // 邻接表类型
**********/
int outDegree(ALGraph G, int k)
/* 求有向图G中k顶点的出度。若k顶点不存在,则返回-1 */
{
if (!G.n || !G.e) return -1;
int out_degree = 0;
AdjVexNodeP p = G.vexs[k].firstArc;
while (p) {
out_degree++;
p = p->next;
}
return out_degree;
}
/**********
【题目】编写算法,计算以邻接表方式存储的有向图G中
k顶点的入度。
图的邻接表存储结构的类型定义如下:
#define UNVISITED 0
#define VISITED 1
#define INFINITY MAXINT // 计算机允许的整数最大值,即∞
typedef char VexType;
typedef enum {DG,DN,UDG,UDN} GraphKind; // 有向图,有向网,无向图,无向网
typedef struct AdjVexNode {
int adjvex; // 邻接顶点在顶点数组中的位序
struct AdjVexNode *next; // 指向下一个邻接顶点(下一条边或弧)
int info; // 存储边(弧)相关信息,对于非带权图可不用
} AdjVexNode, *AdjVexNodeP; // 邻接链表的结点类型
typedef struct VexNode {
VexType data; // 顶点值,VexType是顶点类型,由用户定义
struct AdjVexNode *firstArc; // 邻接链表的头指针
} VexNode; // 顶点数组的元素类型
typedef struct {
VexNode *vexs; // 顶点数组,用于存储顶点信息
int n, e; // 顶点数和边(弧)数
GraphKind kind; // 图的类型
int *tags; // 标志数组
} ALGraph; // 邻接表类型
**********/
int inDegree(ALGraph G, int k)
/* 求有向图G中k顶点的入度。若k顶点不存在,则返回-1 */
{
if (!G.n || !G.e || k>G.n) return -1;
int i, in_degree = 0;
AdjVexNodeP p;
for (i = 0; i < G.n; i++) {
if (i == k) continue;
p = G.vexs[i].firstArc;
while (p) {
if (p->adjvex == k) in_degree++;
p = p->next;
}
}
return in_degree;
}
/**********
【题目】编写算法,创建有向图的邻接表存储结构。
图的邻接表存储结构的类型定义如下:
#define UNVISITED 0
#define VISITED 1
#define MAX_VEX_NUM 4
#define INFINITY MAXINT // 计算机允许的整数最大值,即∞
typedef char VexType;
typedef enum {DG,DN,UDG,UDN} GraphKind; // 有向图,有向网,无向图,无向网
typedef struct AdjVexNode {
int adjvex; // 邻接顶点在顶点数组中的位序
struct AdjVexNode *next; // 指向下一个邻接顶点(下一条边或弧)
int info; // 存储边(弧)相关信息,对于非带权图可不用
} AdjVexNode, *AdjVexNodeP; // 邻接链表的结点类型
typedef struct VexNode {
VexType data; // 顶点值,VexType是顶点类型,由用户定义
struct AdjVexNode *firstArc; // 邻接链表的头指针
} VexNode; // 顶点数组的元素类型
typedef struct {
VexNode vexs[MAX_VEX_NUM]; // 顶点数组,用于存储顶点信息
int n, e; // 顶点数和边(弧)数
GraphKind kind; // 图的类型
int *tags; // 标志数组
} ALGraph; // 邻接表类型
可调用以下基本操作:
int LocateVex(ALGraph G, VexType v); // 查找顶点v在图G中的位序
**********/
Status AddArc_AL(ALGraph &G, int v, int w);
Status CreateDG(ALGraph &G, VexType *vexs, int n,
ArcInfo *arcs, int e)
/* 创建含n个顶点和e条边的有向图G,vexs为顶点信息,arcs为边信息 */
{
if (n<0 || e<0) return ERROR;
int i, j, k;
G.kind = DG;
G.n = n;
G.e = e;
for (k = 0; k < G.n; k++) {
G.vexs[k].data = vexs[k];
G.vexs[k].firstArc = NULL;
}
for (k = 0; k < G.e; k++) {
i = LocateVex(G, arcs[k].v);
j = LocateVex(G, arcs[k].w);
AddArc_AL(G, i, j);
}
return OK;
}
Status AddArc_AL(ALGraph &G, int v, int w)
{
AdjVexNodeP p = G.vexs[v].firstArc;
if(!p) {
G.vexs[v].firstArc = (AdjVexNodeP)malloc(sizeof(AdjVexNode));
G.vexs[v].firstArc->adjvex = w;
} else {
while (p->next) p = p->next;
p->next = (AdjVexNodeP)malloc(sizeof(AdjVexNode));
p->next->adjvex = w;
}
return OK;
}
/**********
【题目】编写算法,创建无向图的邻接表存储结构。
图的邻接表存储结构的类型定义如下:
#define UNVISITED 0
#define VISITED 1
#define MAX_VEX_NUM 4
#define INFINITY MAXINT // 计算机允许的整数最大值,即∞
typedef char VexType;
typedef enum {DG,DN,UDG,UDN} GraphKind; // 有向图,有向网,无向图,无向网
typedef struct AdjVexNode {
int adjvex; // 邻接顶点在顶点数组中的位序
struct AdjVexNode *next; // 指向下一个邻接顶点(下一条边或弧)
int info; // 存储边(弧)相关信息,对于非带权图可不用
} AdjVexNode, *AdjVexNodeP; // 邻接链表的结点类型
typedef struct VexNode {
VexType data; // 顶点值,VexType是顶点类型,由用户定义
struct AdjVexNode *firstArc; // 邻接链表的头指针
} VexNode; // 顶点数组的元素类型
typedef struct {
VexNode vexs[MAX_VEX_NUM]; //*vexs; 顶点数组,用于存储顶点信息
int n, e; // 顶点数和边(弧)数
GraphKind kind; // 图的类型
int *tags; // 标志数组
} ALGraph; // 邻接表类型
可调用以下基本操作:
int LocateVex(ALGraph G, VexType v); // 查找顶点v在图G中的位序
**********/
Status AddArc_AL(ALGraph &G, int v, int w);
Status CreateUDG(ALGraph &G, VexType *vexs, int n,
ArcInfo *arcs, int e)
/* 创建含n个顶点和e条边的无向图G,vexs为顶点信息,arcs为边信息 */
{
if (n<0 || e<0) return ERROR;
int i, j, k;
G.kind = DG;
G.n = n;
G.e = e;
for(k = 0; k < G.n; k++) {
G.vexs[k].data = vexs[k];
G.vexs[k].firstArc = NULL;
}
for(k = 0; k < G.e; k++) {
i = LocateVex(G, arcs[k].v);
j = LocateVex(G, arcs[k].w);
AddArc_AL(G, i, j);
AddArc_AL(G, j, i);
}
return OK;
}
Status AddArc_AL(ALGraph &G, int v, int w)
{
AdjVexNodeP p = G.vexs[v].firstArc;
if(!p) {
G.vexs[v].firstArc = (AdjVexNodeP)malloc(sizeof(AdjVexNode));
G.vexs[v].firstArc->adjvex = w;
} else {
while (p->next) p = p->next;
p->next = (AdjVexNodeP)malloc(sizeof(AdjVexNode));
p->next->adjvex = w;
}
return OK;
}