《图的基本操作》

//图的基本操作:1,深度优先遍历 2,广度优先遍历
#include<stdio.h>
#include<stdlib.h>
#define MAX_VERTEX_NUM 20
int visited[MAX_VERTEX_NUM];    //标志数组作为全局变量

typedef enum
{
    DG,
    DN,
    UDG,
    UDN
}GraphKind;
typedef char VertexType;

typedef struct ArcNode
{
    int adjvex;
    struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode
{
    VertexType data;
    ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct
{
    AdjList vertices;
    int vexnum,arcnum;
    GraphKind kind;
}ALGraph;

void CreateAdjGraph(ALGraph &G)
{
    int i,j,k;
    ArcNode *s;
    printf("Please input n and e:
");    //输入顶点数与边数
    scanf("%d,%d",&G.vexnum,&G.arcnum);
    getchar();
    printf("Please input %d vertex:",G.vexnum);
    for(i=0;i<G.vexnum;i++)
    {
        scanf("%c",&G.vertices[i].data);    //读入顶点信息
        G.vertices[i].firstarc = NULL;        //边表置为空表
    }
    printf("Please input %d edges:
",G.arcnum);
    for(k=0;k<G.arcnum;k++)    //循环e次建立边表
    {
        scanf("%d,%d",&i,&j);    //逆序输入无序对(i,j)
        s = (ArcNode*)malloc(sizeof(ArcNode));
        s->adjvex = j;            //邻接点序号为j
        s->nextarc = G.vertices[i].firstarc;
        G.vertices[i].firstarc = s;
        //将新结点*s插入顶点vi的边表头部(头插法)
        s = (ArcNode*)malloc(sizeof(ArcNode));
        s->adjvex = i;        //邻接点序号为i
        s->nextarc = G.vertices[j].firstarc;
        G.vertices[j].firstarc = s;
        //将新结点*s插入顶点vj的边表头部(头插法)
    }
    printf("
");
    for(i=0;i<G.vexnum;i++)        //显示已建立的邻接表信息
    {
        printf("%2c",G.vertices[i].data);    //顶点结点
        s = G.vertices[i].firstarc;
        while(s)
        {
            printf("->%2d",s->adjvex);    //边表结点
            s = s->nextarc;
        }
        printf("
");
    }
}
void dfs(ALGraph G,int i)
{//从vi出发
    ArcNode *w;    //先访问顶点i
    printf("->%c",G.vertices[i].data);
    visited[i] = 1;
    w = G.vertices[i].firstarc;
    while(w)
    {//从w的邻接点出发深度优先搜索
        if(!visited[w->adjvex])
            dfs(G,w->adjvex);    //递归调用
        w = w->nextarc;
    }
}
void dfstraverse(ALGraph G)
{//深度优先遍历
    int i;
    for(i=0;i<G.vexnum;i++)
    {
        visited[i] = 0;    //初始化标志数组
    }
    printf("dfstraverse visit vertex:");
    for(i=0;i<G.vexnum;i++)
        if(!visited[i])        //vi未访问过
            dfs(G,i);
}//dfstraverse
void bfs(ALGraph G,int v)
{
    int qu[MAX_VERTEX_NUM],f=0,r=0;
    ArcNode *w;
    printf("%c",G.vertices[v].data);
    visited[v]=1;
    qu[0]=v;
    r++;    //初始化队列
    while(f<r)
    {
        v = qu[f++];    //出队
        w = G.vertices[v].firstarc;
        while(w)
        {
            v = w->adjvex;
            if(visited[v]==0)
            {
                visited[v]=1;
                printf("->%c",G.vertices[v].data);
                qu[r++]=v;    //入队
            }
            w = w->nextarc;
        }
    }
}
void bfstraverse(ALGraph G)
{//广度优先遍历
    int i;
    for(i=0;i<G.vexnum;i++)
        visited[i] = 0;        //初始化标志数组
        printf("bfstraverse visit vertex:");
        for(i=0;i<G.vexnum;i++)
            if(visited[i]==0)    //vi未访问过
                bfs(G,i);
}//bftraverse
void main()
{
    ALGraph G;
    int xz = 1;
    while(xz)
    {
        printf("    图的建立及其遍历
");
        printf("==============================
");
        printf("1,建立无向图的邻接表
");
        printf("2,图的深度优先遍历
");
        printf("3,图的广度优先遍历
");
        printf("0,退出系统
");
        printf("==============================
");
        printf("请选择:(0~3)
");
        scanf("%d",&xz);
        getchar();
        switch(xz)
        {
            //顶点数为8,边数为9
            //顶点为:12345678或ABCDEFGH
            //边为:7,4、7,3/6,5/6,2/5,2/4,1/3,1/2,0/1,0
        case 1:printf("输入无向图的相关信息:
");
            G.kind = UDN;
            CreateAdjGraph(G);
            printf("图的邻接表存储结构建立完成
");
            printf("
");
            break;
        case 2:printf("该图的深度优先遍历序列是:
");
            dfstraverse(G);
            //1->2->4->8->5->3->6->7
            //或A->B->D->H->E->C->F->G
            printf("
");
            break;
        case 3:printf("该图的广度优先遍历序列是:
");
            bfstraverse(G);
            //1->2->3->4->5->6-7->8
            //或A->B->C->D->E->F-G
            printf("
");
            break;
        case 0:break;
        default:break;
        }
    }
}

原文地址:https://www.cnblogs.com/sun-/p/5034502.html