• 数据结构——图的遍历(以邻接矩阵为例)


    #include<stdio.h>
    #define N 20
    #define TRUE 1
    #define FALSE 0
    int visited[N];
    typedef struct    /*队列的定义*/
    {
        int data[N];
        int front;//队头指针
        int rear;//队尾指针
    } queue;
    typedef struct    /*图的邻接矩阵*/
    {
        int vexnum,arcnum;
        char vexs[N];
        int arcs[N][N];///邻接矩阵
    } graph;
    
    void createGraph(graph *g);  /*建立一个无向图的邻接矩阵*/
    void dfs(int i,graph *g);    /*从第i个顶点出发深度优先搜索*/
    void tdfs(graph *g);          /*深度优先搜索整个图*/
    void bfs(int k,graph *g);    /*从第k个顶点广度优先搜索*/
    void tbfs(graph *g);          /*广度优先搜索整个图*/
    void init_visit();            /*初始化访问标识数组*/
    
    void createGraph(graph *g)   /*建立一个无向图的邻接矩阵*/
    {
        int i,j;
        char v;
        g->vexnum=0;
        g->arcnum=0;
        i=0;
        printf("输入顶点序列(以#结束):
    ");
        while((v=getchar())!='#')
        {
            g->vexs[i]=v;        /*读入顶点信息*/
            i++;
        }
        g->vexnum=i;             /*顶点数目*/
        for(i=0; i<g->vexnum; i++) /*邻接矩阵初始化*/
        {
            for(j=0; j<g->vexnum; j++)
            {
                g->arcs[i][j]=0;
            }
        }
        printf("输入边的信息:
    ");
        scanf("%d,%d",&i,&j);  /*读入边i,j*/
        while(i!=-1)              /*读入i,j为-1时结束*/
        {
            g->arcs[i][j]=1;
            g->arcs[j][i]=1;
            scanf("%d,%d",&i,&j);
        }
    }
    
    void dfs(int i,graph *g) /*从第i个顶点出发深度优先搜索*/
    {
        int j;
        printf("%c",g->vexs[i]);
        visited[i]=1;
        for(j=0; j<g->vexnum; j++)
        {
            if(visited[j]==0&&g->arcs[i][j]==1)
            {
                dfs(j,g);
            }
        }
    }
    
    
    void tdfs(graph *g)      /*深度优先搜索整个图*/
    {
        int i;
        printf("
    从顶点%C开始深度优先搜索序列:",g->vexs[0]);
        for(i=0; i<g->vexnum; i++)
        {
            if(visited[i]!=1)
            {
                dfs(i,g);
            }
        }
    }
    void bfs(int k,graph *g)  /*从第k个顶点广度优先搜索*/
    {
        int i,j;
        queue qlist,*q;
        q=&qlist;
        q->rear=0;
        q->front=0;
        printf("%c",g->vexs[k]);
        visited[k]=TRUE;
        q->data[q->rear]=k;
        q->rear=(q->rear+1)%N;//更新队尾指针
        while(q->rear!=q->front)//队不空
        {
            i=q->data[q->front];//去队首元素
            q->front=(q->front+1)%N;
            for(j=0; j<g->vexnum; j++)//便利所有的结点,找到与i相关联的点
            {
                if((g->arcs[i][j]==1)&&(!visited[j]))//找到未便利的点
                {
                    printf("%c",g->vexs[j]);//输出
                    visited[j]=TRUE;//修改访问标志
                    q->data[q->rear]=j;//入队
                    q->rear=(q->rear+1)%N;
                }
            }
        }
    }
    
    void tbfs(graph *g) /*广度优先搜索整个图*/
    {
        int i;
        printf("
    从顶点%C开始广度优先搜索序列:",g->vexs[0]);
        for(i=0; i<g->vexnum; i++)
            if(visited[i]!=TRUE)
                bfs(i,g);
    }
    
    void init_visit()   /*初始化访问标识数组*/
    {
        int i;
        for(i=0; i<N; i++)
        {
            visited[i]=FALSE;
        }
    }
    
    int main()
    {
        graph ga;
        int i,j;
        createGraph(&ga);
        printf("无向图的邻接矩阵:
    ");
        for(i=0; i<ga.vexnum; i++)
        {
            for(j=0; j<ga.vexnum; j++)
                printf("%3d",ga.arcs[i][j]);
            printf("
    ");
        }
        init_visit();
        tbfs(&ga);
        return 0;
    }
  • 相关阅读:
    MPlayer 开始支持RTSP/RTP流媒体文件
    Linux(CentOS 6.4)系统中安装mplayer
    IP实时传输协议RTP/RTCP详解
    --without-v4l ,make clean, 重新make即可。
    关于IP数据包首部校验字段的理解
    转[总结]FFMPEG视音频编解码零基础学习方法 .
    指针为什么分类型
    IOS-ARC和垃圾回收机制
    IOS-frame和bounds有什么不同
    iOS-消息推送机制的实现
  • 原文地址:https://www.cnblogs.com/wkfvawl/p/9991056.html
Copyright © 2020-2023  润新知