• DFS&&BFS ---C ----complete


    //
    //  main.cpp
    //  BFS_cursive
    //
    //  Created by 韩雪滢 on 10/23/16.
    //  Copyright © 2016 韩雪滢. All rights reserved.
    //
    
    
    #include <stdio.h>
    #include <stdlib.h>
    
    #define NUM_VERTEX 10
    
    struct Vertex {
        char name;
        int mark;
        struct Node* list;
    };
    struct Node {
        struct Vertex* vertex;
        struct Node* next;
    };
    struct Queue {
    };
    typedef struct Vertex Vertex;
    typedef struct Node Node;
    
    // creates a new vertex and return pointer to it
    Vertex* new_vertex(char name) {
        Vertex* vertex = (Vertex*)malloc(sizeof(Vertex));
        vertex->name = name;
        vertex->list = 0;
        return vertex;
    }
    
    // connect the vertex a to vertex b
    // by adding b to a's linked list!
    void do_connect(Vertex* a, Vertex* b) {
        Node* node = (Node*)malloc(sizeof(Node));
        node->vertex = b;
        node->next = a->list;
        a->list = node;
    }
    
    // connects a to b and b to a
    void connect(Vertex* a, Vertex* b) {
        do_connect (a, b);
        do_connect (b, a);
    }
    
    // visit function
    void visit(Vertex* vertex) {
        printf ("
    %5d. %c", vertex->mark, vertex->name);
    }
    
    // do a depth first search
    void do_dfs(Vertex *vertex, int* count) {
        Node* p = vertex->list;
        vertex->mark = ++(*count);
        visit (vertex);
        while (p != 0) {
            if (!p->vertex->mark) {
                do_dfs (p->vertex, count);
            }
            p = p->next;
        }
    }
    void dfs(Vertex *graph[]) {
        int i;
        int count = 0;
        // set all to unvisited
        for (i = 0; i < NUM_VERTEX; i ++) {
            graph[i]->mark = 0;
        }
        // each vertex dfs it
        for (i = 0; i < NUM_VERTEX; i ++) {
            if (graph[i]->mark == 0) {
                do_dfs (graph[i], &count);
            }
        }
    }
    
    // breadth first search
    void do_bfs(Vertex *vertex, int* count) {
        Node *initialQueue, *front, *rear, *p, *temp;
        Vertex *w;
        // count = count + 1, mark vertex with count
        vertex->mark = ++(*count);
        visit (vertex);
        // initialize a queue, and initialize with vertex.
        initialQueue = (Node*)malloc(sizeof(Node));
        initialQueue->vertex = vertex;
        initialQueue->next = 0;
        front = initialQueue;
        rear  = initialQueue;
        // while queue is not empty
        while (front != 0) {
            // for vertyex w in V adjacent to the front vertex
            p = front->vertex->list;
            while (p != 0) {
                w = p->vertex;
                // if w is marked with 0
                if (w->mark == 0) {
                    Node* nextQueue;
                    // count = count + 1, mark w with count
                    w->mark = ++(*count);
                    visit (w);
                    // add w to queue
                    nextQueue = (Node*)malloc(sizeof(Node));
                    nextQueue->vertex = w;
                    nextQueue->next = 0;
                    rear->next = nextQueue;
                    rear = nextQueue;
                }
                p = p->next;
            }
            // remove front vertex from queue
            temp = front;
            front = front->next;
            free (temp);
        }
    }
    void bfs(Vertex *graph[]) {
        int i;
        int count = 0;
        // set all to unvisited
        for (i = 0; i < NUM_VERTEX; i ++) {
            graph[i]->mark = 0;
        }
        // each vertex bfs it
        for (i = 0; i < NUM_VERTEX; i ++) {
            if (graph[i]->mark == 0) {
                do_bfs (graph[i], &count);
            }
        }
    }
    
    // main function
    int main() {
        
        // create a adjacency list
        Vertex *graph[NUM_VERTEX] = {
            new_vertex('A'), //[0]
            new_vertex('B'), //[1]
            new_vertex('C'), //[2]
            new_vertex('D'), //[3]
            new_vertex('E'), //[4]
            new_vertex('F'), //[5]
            new_vertex('G'), //[6]
            new_vertex('H'), //[7]
            new_vertex('I'), //[8]
            new_vertex('J')  //[9]
        };
        
        // connect the vertices
        connect(graph[0], graph[2]);
        connect(graph[0], graph[3]);
        connect(graph[0], graph[4]);
        connect(graph[1], graph[4]);
        connect(graph[1], graph[5]);
        connect(graph[2], graph[3]);
        connect(graph[2], graph[5]);
        connect(graph[4], graph[5]);
        connect(graph[6], graph[7]);
        connect(graph[6], graph[9]);
        connect(graph[7], graph[8]);
        connect(graph[8], graph[9]);
        
        // depth first search
        printf ("DFS: ");
        dfs (graph);
        
        // breadth first search
        printf ("
    
    ");
        printf ("BFS: ");
        bfs (graph);
        
        printf ("
    
    And that's it!!");
        getchar ();
        
    }
  • 相关阅读:
    网络设备snmp配置syslog方法。
    Oracle19c安装手册Windows及mysql-oracle转换
    Oracle11g--hxss安装
    VMWare ESXI 6.5 的部署及简单使用的说明
    windos下redis的启动与安装
    二、fidder 和 python结合进行 get post 请求发送
    一、fidder工具使用
    Python学习二《数据类型介绍》
    Python学习一《基础规范》
    Charles设置为代理服务
  • 原文地址:https://www.cnblogs.com/HackHer/p/5990792.html
Copyright © 2020-2023  润新知