首页 > 软件开发 > C语言 >

C语言实现广度/深度优先算法

来源:互联网 2023-03-16 19:12:16 195

本程序使用邻接表建立了一个含有9个顶点的图,如下图

z7E办公区 - 实用经验教程分享!

z7E办公区 - 实用经验教程分享!

C语言实现广度/深度优先算法z7E办公区 - 实用经验教程分享!

方法/步骤

  • 1

    首先打开VC 6.0

    z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    C语言实现广度/深度优先算法z7E办公区 - 实用经验教程分享!

  • 2

    选择文件,新建

    z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    C语言实现广度/深度优先算法z7E办公区 - 实用经验教程分享!

  • 3

    选择C source file 新建一个空白文档

    z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    C语言实现广度/深度优先算法z7E办公区 - 实用经验教程分享!

  • 4

    首先声明头文件和一些常量z7E办公区 - 实用经验教程分享!

    #include stdlib.h>z7E办公区 - 实用经验教程分享!

    #include stdio.h>z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    #define MAX_VEXTEX_NUM 9 /* 图中顶点数 */z7E办公区 - 实用经验教程分享!

    #define ARC_NUM 12 /* 图中弧数 */z7E办公区 - 实用经验教程分享!

    #define MAX_QUEUEMEM (MAX_VEXTEX_NUM 1)z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    C语言实现广度/深度优先算法z7E办公区 - 实用经验教程分享!

  • 5

    定义数组,因为是排序,必须有数据z7E办公区 - 实用经验教程分享!

    /* 定义描述图的顶点之间连接信息的数组 */z7E办公区 - 实用经验教程分享!

    int GraphEdge[ARC_NUM * 2][2] = {{0,1},{1,0},{1,2},{2,1},{2,3},{3,2},{3,4},{4,3},{4,5},{5,4},{5,0},{0,5},{0,6},{6,0},{6,8},{8,6},{6,7},{7,6},{7,8},{8,7},{7,3},{3,7},{8,4},{4,8}};z7E办公区 - 实用经验教程分享!

    /*定义数组visited用来标示一离码个顶点是否被访问过*/z7E办公区 - 实用经验教程分享!

    int visited[MAX_VEXTEX_NUM]={0,0,0,0,0,0,0,0,0};z7E办公区 - 实用经验教程分享!

    /*定义表结点,即每条弧对应的结点 */z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    C语言实现广度/深度优先算法z7E办公区 - 实用经验教程分享!

  • 6

    定义三个结构体,分别是指针,顶点信息,图的结构z7E办公区 - 实用经验教程分享!

    typedef struct ArcNode{z7E办公区 - 实用经验教程分享!

    int adjvex; 塑夏贪 /* 该弧所指向的顶点的位置 */z7E办公区 - 实用经验教程分享!

    struct ArcNode * nextarc; /* 指向下一条弧的指针 */z7E办公区 - 实用经验教程分享!

    }ArcNode;z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    /* 定义头结点 */z7E办公区 - 实用经验教程分享!

    typedef struct VNode{z7E办公区 - 实用经验教程分享!

    int data; /* 顶点信息 */z7E办公区 - 实用经验教程分享!

    struct ArcNode * firstarc; /* 指向第一条依附该顶点的弧的指针 */z7E办公区 - 实用经验教程分享!

    }VNode,AdjList[MAX_VEXTEX_NUM]; z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    /* 定义图的结构 */z7E办公区 - 实用经验教程分享!

    typedef struct {z7E办公区 - 实用经验教程分享!

    VNode vertices[MAX_VEXTEX_NUM];/* 定义表头数组 */z7E办公区 - 实用经验教程分享!

    int vexnum; /* 定义图中顶点数 */z7E办公区 - 实用经验教程分享!

    int arcnum; /* 定义图中弧数 */z7E办公区 - 实用经验教程分享!

    }ALGraph;z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    C语言实现广度/深度优先算法z7E办公区 - 实用经验教程分享!

  • 7

    现在要建立一个使用邻接表存储的图z7E办公区 - 实用经验教程分享!

    void CreateGraph(ALGraph * alGraph)z7E办公区 - 实用经验教程分享!

    {z7E办公区 - 实用经验教程分享!

    int i,j;z7E办公区 - 实用经验教程分享!

    ArcNode * newnode;z7E办公区 - 实用经验教程分享!

    ArcNode * vexNode;z7E办公区 - 实用经验教程分享!

    alGraph->vexnum = MAX_VEXTEX_NUM;z7E办公区 - 实用经验教程分享!

    alGraph->arcnum = ARC_NUM;z7E办公区 - 实用经验教程分享!

    /* 初始化表头 */z7E办公区 - 实用经验教程分享!

    for(i=0;iMAX_VEXTEX_NUM;i )z7E办公区 - 实用经验教程分享!

    {z7E办公区 - 实用经验教程分享!

    alGraph->vertices[i].data = i;z7E办公区 - 实用经验教程分享!

    alGraph->vertices[i].firstarc = NULL;z7E办公区 - 实用经验教程分享!

    }z7E办公区 - 实用经验教程分享!

    for(j=0;j2*ARC_NUM;j )z7E办公区 - 实用经验教程分享!

    {z7E办公区 - 实用经验教程分享!

    i = GraphEdge[j][0];z7E办公区 - 实用经验教程分享!

    if(alGraph->vertices[i].firstarc==NULL)z7E办公区 - 实用经验教程分享!

    {z7E办公区 - 实用经验教程分享!

    newnode = ( ArcNode * ) malloc (sizeof(ArcNode));z7E办公区 - 实用经验教程分享!

    newnode->adjvex = GraphEdge[j][1];z7E办公区 - 实用经验教程分享!

    newnode->nextarc = NULL;z7E办公区 - 实用经验教程分享!

    alGraph->vertices[i].firstarc = newnode;z7E办公区 - 实用经验教程分享!

    }z7E办公区 - 实用经验教程分享!

    elsez7E办公区 - 实用经验教程分享!

    {z7E办公区 - 实用经验教程分享!

    vexNode = alGraph->vertices[i].firstarc;z7E办公区 - 实用经验教程分享!

    while(vexNode->nextarc != NULL)z7E办公区 - 实用经验教程分享!

    {z7E办公区 - 实用经验教程分享!

    vexNode = vexNode->nextarc;z7E办公区 - 实用经验教程分享!

    }z7E办公区 - 实用经验教程分享!

    newnode = ( ArcNode * ) malloc (sizeof(ArcNode));z7E办公区 - 实用经验教程分享!

    newnode->adjvex = GraphEdge[j][1];z7E办公区 - 实用经验教程分享!

    newnode->nextarc = NULL;z7E办公区 - 实用经验教程分享!

    vexNode->nextarc = newnode;z7E办公区 - 实用经验教程分享!

    }z7E办公区 - 实用经验教程分享!

    }z7E办公区 - 实用经验教程分享!

    }z7E办公区 - 实用经验教程分享!

    针董z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    C语言实现广度/深度优先算法z7E办公区 - 实用经验教程分享!

  • 8

    输出次图的函数 z7E办公区 - 实用经验教程分享!

    void OutputGraph(ALGraph * alGraph)z7E办公区 - 实用经验教程分享!

    {z7E办公区 - 实用经验教程分享!

    int i;z7E办公区 - 实用经验教程分享!

    ArcNode * vexNode;z7E办公区 - 实用经验教程分享!

    printf("The graph dedicated by adjacency list is:\n");z7E办公区 - 实用经验教程分享!

    for(i=0;iMAX_VEXTEX_NUM;i )z7E办公区 - 实用经验教程分享!

    {z7E办公区 - 实用经验教程分享!

    printf("the header is: [%d] -> ",alGraph->vertices[i].data);z7E办公区 - 实用经验教程分享!

    vexNode = alGraph->vertices[i].firstarc;z7E办公区 - 实用经验教程分享!

    while(vexNode != NULL)z7E办公区 - 实用经验教程分享!

    {z7E办公区 - 实用经验教程分享!

    printf("[%d] -> ",vexNode->adjvex);z7E办公区 - 实用经验教程分享!

    vexNode=vexNode->nextarc;z7E办公区 - 实用经验教程分享!

    }z7E办公区 - 实用经验教程分享!

    printf("[]\n");z7E办公区 - 实用经验教程分享!

    }z7E办公区 - 实用经验教程分享!

    }z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    C语言实现广度/深度优先算法z7E办公区 - 实用经验教程分享!

  • 9

    递归实现DFSz7E办公区 - 实用经验教程分享!

    void DFS(ALGraph * alGraph,int v)z7E办公区 - 实用经验教程分享!

    {z7E办公区 - 实用经验教程分享!

    int w;z7E办公区 - 实用经验教程分享!

    ArcNode * vexNode;z7E办公区 - 实用经验教程分享!

    visited[v] = 1;z7E办公区 - 实用经验教程分享!

    printf("[%d] -> ",v);z7E办公区 - 实用经验教程分享!

    vexNode = alGraph->vertices[v].firstarc;z7E办公区 - 实用经验教程分享!

    while(vexNode != NULL)z7E办公区 - 实用经验教程分享!

    {z7E办公区 - 实用经验教程分享!

    w = vexNode->adjvex;z7E办公区 - 实用经验教程分享!

    if(visited[w]==0)z7E办公区 - 实用经验教程分享!

    DFS(alGraph,w);z7E办公区 - 实用经验教程分享!

    vexNode = vexNode->nextarc;z7E办公区 - 实用经验教程分享!

    }z7E办公区 - 实用经验教程分享!

    }z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    C语言实现广度/深度优先算法z7E办公区 - 实用经验教程分享!

  • 10

    图的深度优先遍历 z7E办公区 - 实用经验教程分享!

    void DFSTraverse(ALGraph * alGraph)z7E办公区 - 实用经验教程分享!

    {z7E办公区 - 实用经验教程分享!

    int i;z7E办公区 - 实用经验教程分享!

    /*访问标志数组初始化*/z7E办公区 - 实用经验教程分享!

    for(i=0;iMAX_VEXTEX_NUM;i )z7E办公区 - 实用经验教程分享!

    {z7E办公区 - 实用经验教程分享!

    visited[i] = 0;z7E办公区 - 实用经验教程分享!

    }z7E办公区 - 实用经验教程分享!

    printf("\n");z7E办公区 - 实用经验教程分享!

    puts("********************************************");z7E办公区 - 实用经验教程分享!

    puts("* the function DFSTraverse will traverse *");z7E办公区 - 实用经验教程分享!

    puts("* the graphby Depth First Search *");z7E办公区 - 实用经验教程分享!

    puts("********************************************");z7E办公区 - 实用经验教程分享!

    puts("the result of DFS is:");z7E办公区 - 实用经验教程分享!

    for(i=0;iMAX_VEXTEX_NUM;i )z7E办公区 - 实用经验教程分享!

    {z7E办公区 - 实用经验教程分享!

    if(visited[i] == 0)z7E办公区 - 实用经验教程分享!

    DFS(alGraph,i);z7E办公区 - 实用经验教程分享!

    }z7E办公区 - 实用经验教程分享!

    printf("[end]\n");z7E办公区 - 实用经验教程分享!

    }z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    C语言实现广度/深度优先算法z7E办公区 - 实用经验教程分享!

  • 11

    为了实现广度优先遍历,需要借助一个队列 z7E办公区 - 实用经验教程分享!

    typedef struct{z7E办公区 - 实用经验教程分享!

    int queuemem[MAX_QUEUEMEM];z7E办公区 - 实用经验教程分享!

    int header;z7E办公区 - 实用经验教程分享!

    int rear;z7E办公区 - 实用经验教程分享!

    }QUEUE;z7E办公区 - 实用经验教程分享!

    void InitQueue(QUEUE *queue)z7E办公区 - 实用经验教程分享!

    {z7E办公区 - 实用经验教程分享!

    queue->header = 0;z7E办公区 - 实用经验教程分享!

    queue->rear = 0;z7E办公区 - 实用经验教程分享!

    }z7E办公区 - 实用经验教程分享!

    void EnQueue(QUEUE *queue,int v)z7E办公区 - 实用经验教程分享!

    {z7E办公区 - 实用经验教程分享!

    queue->queuemem[queue->rear] = v;z7E办公区 - 实用经验教程分享!

    queue->rear ;z7E办公区 - 实用经验教程分享!

    }z7E办公区 - 实用经验教程分享!

    int DelQueue(QUEUE *queue)z7E办公区 - 实用经验教程分享!

    {z7E办公区 - 实用经验教程分享!

    return queue->queuemem[queue->header ];z7E办公区 - 实用经验教程分享!

    }z7E办公区 - 实用经验教程分享!

    int EmptyQueue(QUEUE *queue)z7E办公区 - 实用经验教程分享!

    {z7E办公区 - 实用经验教程分享!

    if(queue->header == queue->rear)z7E办公区 - 实用经验教程分享!

    return 1;z7E办公区 - 实用经验教程分享!

    return 0;z7E办公区 - 实用经验教程分享!

    }z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    C语言实现广度/深度优先算法z7E办公区 - 实用经验教程分享!

  • 12

    广度优先遍历 z7E办公区 - 实用经验教程分享!

    void BFSTraverse(ALGraph * alGraph)z7E办公区 - 实用经验教程分享!

    {z7E办公区 - 实用经验教程分享!

    int i;z7E办公区 - 实用经验教程分享!

    int w;z7E办公区 - 实用经验教程分享!

    ArcNode * vexNode;z7E办公区 - 实用经验教程分享!

    QUEUE queue;z7E办公区 - 实用经验教程分享!

    InitQueue(&queue);z7E办公区 - 实用经验教程分享!

    /*访问标志数组初始化*/z7E办公区 - 实用经验教程分享!

    for(i=0;iMAX_VEXTEX_NUM;i )z7E办公区 - 实用经验教程分享!

    {z7E办公区 - 实用经验教程分享!

    visited[i] = 0;z7E办公区 - 实用经验教程分享!

    }z7E办公区 - 实用经验教程分享!

    printf("\n");z7E办公区 - 实用经验教程分享!

    puts("********************************************");z7E办公区 - 实用经验教程分享!

    puts("* the function BFSTraverse will traverse *");z7E办公区 - 实用经验教程分享!

    puts("* the graph by Breadth First Search *");z7E办公区 - 实用经验教程分享!

    puts("********************************************");z7E办公区 - 实用经验教程分享!

    puts("the result of BFS is:");z7E办公区 - 实用经验教程分享!

    for(i=0;iMAX_VEXTEX_NUM;i )z7E办公区 - 实用经验教程分享!

    {z7E办公区 - 实用经验教程分享!

    if(visited[i] == 0)z7E办公区 - 实用经验教程分享!

    {z7E办公区 - 实用经验教程分享!

    visited[i] = 1;z7E办公区 - 实用经验教程分享!

    printf("[%d] -> ",i);z7E办公区 - 实用经验教程分享!

    EnQueue(&queue,i);z7E办公区 - 实用经验教程分享!

    while(!EmptyQueue(&queue))z7E办公区 - 实用经验教程分享!

    {z7E办公区 - 实用经验教程分享!

    w = DelQueue(&queue);z7E办公区 - 实用经验教程分享!

    vexNode = alGraph->vertices[w].firstarc;z7E办公区 - 实用经验教程分享!

    while(vexNode != NULL)z7E办公区 - 实用经验教程分享!

    {z7E办公区 - 实用经验教程分享!

    w = vexNode->adjvex;z7E办公区 - 实用经验教程分享!

    if(visited[w]==0)z7E办公区 - 实用经验教程分享!

    {z7E办公区 - 实用经验教程分享!

    visited[w] = 1;z7E办公区 - 实用经验教程分享!

    printf("[%d] -> ",w);z7E办公区 - 实用经验教程分享!

    EnQueue(&queue,w);z7E办公区 - 实用经验教程分享!

    }z7E办公区 - 实用经验教程分享!

    vexNode = vexNode->nextarc;z7E办公区 - 实用经验教程分享!

    }z7E办公区 - 实用经验教程分享!

    }z7E办公区 - 实用经验教程分享!

    }z7E办公区 - 实用经验教程分享!

    }z7E办公区 - 实用经验教程分享!

    printf("[end]\n");z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    }z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    C语言实现广度/深度优先算法z7E办公区 - 实用经验教程分享!

  • 13

    一大堆的函数,主函数就几句话。。z7E办公区 - 实用经验教程分享!

    int main()z7E办公区 - 实用经验教程分享!

    {z7E办公区 - 实用经验教程分享!

    /*定义图结点*/z7E办公区 - 实用经验教程分享!

    ALGraph alGraph;z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    /*建立图的邻接表*/z7E办公区 - 实用经验教程分享!

    CreateGraph(&alGraph);z7E办公区 - 实用经验教程分享!

    /*输出图的邻接表*/z7E办公区 - 实用经验教程分享!

    OutputGraph(&alGraph);z7E办公区 - 实用经验教程分享!

    /*深度优先遍历*/z7E办公区 - 实用经验教程分享!

    DFSTraverse(&alGraph);z7E办公区 - 实用经验教程分享!

    /*广度优先遍历*/z7E办公区 - 实用经验教程分享!

    BFSTraverse(&alGraph);z7E办公区 - 实用经验教程分享!

    getch();z7E办公区 - 实用经验教程分享!

    return 0;z7E办公区 - 实用经验教程分享!

    }z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    C语言实现广度/深度优先算法z7E办公区 - 实用经验教程分享!

  • 13相关内容未经许可获取自百度经验
  • 14

    执行结果

    z7E办公区 - 实用经验教程分享!

    z7E办公区 - 实用经验教程分享!

    C语言实现广度/深度优先算法z7E办公区 - 实用经验教程分享!

  • 以上方法由办公区教程网编辑摘抄自百度经验可供大家参考!z7E办公区 - 实用经验教程分享!


    标签: C语言

    办公区 Copyright © 2016-2023 www.bgqu.net. Some Rights Reserved. 备案号:湘ICP备2020019561号统计代码