GraphDepth

//GraphDepth.cpp--page 157 7.1(b)
//Depth_First Search
#include < stdio.h > 
#include < stdlib.h > 
#include "ghl1.h"
#define MAX_VERTEX_NUM 20 
typedef int VRType;
typedef int VertexType;
typedef struct ArcCell {
    VRType adj;
}
ArcCell,
AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct {
    VertexType vexs[MAX_VERTEX_NUM];
    AdjMatrix arcs;
    int vexnum,
    arcnum;
}
MGraph;
Status CreateUDN(MGraph & G);
int LocateVex(const MGraph & G, VertexType v);
void DFSTraverse(const MGraph & G, Status( * Visit)(const MGraph & G, int v));
void DFS(const MGraph & G, int i);
int FirstAdjVex(const MGraph & G, int i);
int NextAdjVex(const MGraph & G, int i, int w);
Status PrintVex(const MGraph & G, int i);
int visited[MAX_VERTEX_NUM];
Status( * VisitFunc)(const MGraph & G, int v);
int main(void) {
    MGraph G;
    printf("\n");
    CreateUDN(G);
    DFSTraverse(G, PrintVex);
    return 0;
}
Status CreateUDN(MGraph & G) {
    int i,
    j,
    k;
    VertexType v1,
    v2;
    printf("Enter vertex number:");
    scanf("%d", &G.vexnum);
    printf("Enter arc number:");
    scanf("%d", &G.arcnum);
    for (i = 0; i < G.vexnum; i++) {
        printf("Enter %d vertex:", i + 1);
        scanf("%d", &G.vexs);
    }
    for (i = 0; i < G.vexnum; i++) for (j = 0; j < G.vexnum; j++) G.arcs[j].adj = 0;
    for (k = 0; k < G.arcnum; k++) {
        printf("Enter %d arc:\n", k + 1);
        printf("Enter the first vertex:");
        scanf("%d", &v1);
        printf("Enter the second vertex:");
        scanf("%d", &v2);
        i = LocateVex(G, v1);
        j = LocateVex(G, v2);
        G.arcs[j].adj = G.arcs[j].adj = 1;
    }
    return OK;
}
int LocateVex(const MGraph & G, VertexType v) {
    int i = 0;
    while (G.vexs != v) i++;
    if (i < G.vexnum) return i;
    else return INFEASIBLE;
}
void DFSTraverse(const MGraph & G, Status( * Visit)(const MGraph & G, int v)) {
    int i;
    VisitFunc = Visit;
    for (i = 0; i < G.vexnum; i++) visited = FALSE;
    for (i = 0; i < G.vexnum; i++) if (!visited) DFS(G, i);
}
void DFS(const MGraph & G, int i) {
    int w;
    visited = TRUE;
    VisitFunc(G, i);
    for (w = FirstAdjVex(G, i); w >= 0; w = NextAdjVex(G, i, w)) if (!visited[w]) DFS(G, w);
}
int FirstAdjVex(const MGraph & G, int i) {
    int j;
    for (j = 0; j < G.vexnum; j++) if (G.arcs[j].adj == 1) return j;
    return INFEASIBLE;
}
int NextAdjVex(const MGraph & G, int i, int w) {
    int j;
    for (j = w + 1; j < G.vexnum; j++) if (G.arcs[j].adj == 1) return j;
    return INFEASIBLE;
}
Status PrintVex(const MGraph & G, int i) {
    printf("%5d", G.vexs);
    return OK;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值