zoukankan      html  css  js  c++  java
  • 图的遍历

    #include<stdio.h>
    #include<stdlib.h>
    #define MaxVex 100
    int visited[MaxVex]; //定义全局数组,用于记录图中节点的访问状态
    
    typedef struct EdgeNode{ //定义边节点
        int adjvex;          //该邻接点在顶点数组中的下标
        struct EdgeNode *next;//指向下一个邻接点
    }EdgeNode;
    
    typedef struct VexNode{ //顶点节点 
        char data;//顶点信息
        EdgeNode *firstedge; //边表头指针(指向第一条依附于该顶点的边的指针)
    }VexNode,Adjlist[MaxVex];//结构体数组,储存顶点
    
    typedef struct Graph{//图结构体
        Adjlist adjlist;//结构体数组,储存所有的顶点
        int numVexs,numEdges;//顶点的数量、边的总数。
    }Graph;
    //队列相关
    typedef struct queue
    {
        int data[MaxVex];//用于记录顶点;
        int front;
        int rear;
    }queue;
    
    void initqueue(queue* Q){//初始化队列
        Q->front=Q->rear=0;
    }
    
    int isfull(queue *Q){//判断队列是否满
        if(Q->front==Q->rear){
            return 1;
        }
        else return 0;
    }
    
    void inqueue(queue *Q,int e){//入队函数
        if(!isfull(Q)){
            Q->data[Q->rear]=e;
            Q->rear++;
        }
    }
    
    int outqueue(queue *Q){//出队函数
        int temp=Q->data[Q->front];
        Q->front++;
        return temp;
    }
    
    //******  建立图的邻接表结构 ******
    void createGraph(Graph *G){
        /*if(G==NULL){//为图节点开辟空间
            G=(Graph*)malloc(sizeof(Graph));
        }*/
        printf("请输入图的顶点数和边数(以逗号隔开):
    ");
        scanf("%d,%d",&G->numVexs,&G->numEdges);
        getchar();//缓冲回车
        printf("输入顶点数据:
    ");
        int i;
        for(i=0;i<G->numVexs;i++){
            scanf("%c",&(G->adjlist[i].data));
            G->adjlist[i].firstedge=NULL;//置空边节点。
            getchar();//缓冲回车
        }
        int j,temp1,temp2;
        for(j=0;j<G->numEdges;j++){
            printf("输入边对应的两个顶点序号(以逗号隔开):
    ");
            scanf("%d,%d",&temp1,&temp2);
            EdgeNode *p= (EdgeNode*)malloc(sizeof(EdgeNode));//为边节点开辟空间
            p->adjvex=temp2;
            p->next=G->adjlist[temp1].firstedge;
            G->adjlist[temp1].firstedge=p;
    
            p=(EdgeNode*)malloc(sizeof(EdgeNode));
            p->adjvex=temp1;
            p->next=G->adjlist[temp2].firstedge;
            G->adjlist[temp2].firstedge=p;
    
        }
    }
    
    void DFS(Graph *G,int i){
        visited[i]=1;//标记已访问
        printf("%c ",G->adjlist[i].data);//输入顶点数据
        EdgeNode *p=G->adjlist[i].firstedge;//p指向与该顶点相连的第一条边
        while (p!=NULL)//一直遍历这个顶点的边,直到指针为空
        {
            if (!visited[p->adjvex])
            {
                DFS(G,p->adjvex);//递归深度遍历
            }
            p=p->next;
        }
    }
    
    void DFSTraverse(Graph* G){
        int i;
        for(i=0;i<G->numVexs;i++){
            visited[i]=0;//初始化顶点数组
        }
        for(i=0;i<G->numVexs;i++){
            if(!visited[i]){
                DFS(G,i);
            }
        }
    }
    
    void BFSTraverse(Graph *G){
        //建立队列
        queue Q;
        initqueue(&Q);//初始化队列
        int i;
        for(i=0;i<G->numVexs;i++){
            visited[i]=0;
        }//清除遍历记录
        for(i=0;i<G->numVexs;i++){
            if(!visited[i]){//选定一个节点,入队。
                visited[i]=1;
                printf("%c ",G->adjlist[i].data);
                inqueue(&Q,i);
                
            }
            if(!isfull(&Q)){
                i=outqueue(&Q);//取对头元素,依次通过边节点来输出其邻接点对应的数值,同时将邻接点入队。
                EdgeNode *p=G->adjlist[i].firstedge;
                while (p!=NULL)
                {
                    if(!visited[p->adjvex]){
                        visited[p->adjvex]=1;
                         printf("%c",G->adjlist[p->adjvex]);
                        inqueue(&Q,p->adjvex);
                    }
                    p=p->next;//指向通向下一个临界点的边
                }
                
            }
        }
    
    }
    int main(){
        Graph G;//初始置空,在函数中为图节点开辟空间
        createGraph(&G);//创建图
        printf("
    图的深度优先遍历为:
    ");
        DFSTraverse(&G);
        printf("
    图的广度优先遍历为:
    ");
        BFSTraverse(&G);
        return 0;
    
    }
    

      

    人生如逆旅,我亦是行人
  • 相关阅读:
    mybatis
    Enumeration接口
    oracle undo 解析(转载收藏)
    Windows下RabbitMQ的安装
    Aliyun服务器安装Docker
    Redis主从复制、哨兵模式
    Redis持久化-AOF
    Redis持久化-RDB
    Nginx快速上手
    有关Eureka的其他重点配置
  • 原文地址:https://www.cnblogs.com/sz2003/p/15328367.html
Copyright © 2011-2022 走看看