zoukankan      html  css  js  c++  java
  • 邻接表储存图+深度搜索遍历 ——数据结构课程

    提供了邻接表结构体的标准类型;

    以及基于该类型结构体的深搜函数;

    void CreateAdj(AdjGraph *&G) { //创建图的邻接表
    
        int i,j;
        int n;
        int A[MAXN][MAXN];
        printf("请输入矩阵的阶数:\n");
        scanf("%d",&n);
        printf("请输入一个%d*%d的邻接矩阵\n",n,n);
        for(i=0; i<n; i++)
            for(j=0; j<n; j++)
                scanf("%d",&A[i][j]);
    
        ArcNode *p;
        G=(AdjGraph *)malloc(sizeof(AdjGraph));
        for (i=0; i<n; i++) //给邻接表中所有头结点的指针域置初值
            G->adjlist[i].firstarc=NULL;
        for (i=0; i<n; i++)         //检查邻接矩阵中每个元素
            for (j=n-1; j>=0; j--)
                if (A[i][j]!=0 ) {   //存在一条边
                    n++;
                    p=(ArcNode *)malloc(sizeof(ArcNode)); //创建一个结点p
                    p->adjvex=j;               //存放邻接点
                    p->weight=A[i][j];            //存放权
                    p->nextarc=G->adjlist[i].firstarc; //采用头插法插入结点p
                    G->adjlist[i].firstarc=p;
                }
        G->n=n;
    }
    void DFS(AdjGraph *G,int v) {
        ArcNode *p;
        int w;
        visited[v]=1;        //置已访问标记
        printf("%d  ",v);    //输出被访问顶点的编号
        p=G->adjlist[v].firstarc;
        //p指向顶点v的第一条边的边头结点
        while (p!=NULL) {
            w=p->adjvex;
            if (visited[w]==0)
                DFS(G,w);   //若w顶点未访问,递归访问它
            p=p->nextarc;//p指向顶点v的下一条边的边头结点         
        }
    }
    代码
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<malloc.h>
    using namespace std;
    const int MAXN=100;
    bool visited[MAXN];
    typedef struct ANode {
        int adjvex;        //该边的终点编号
        struct ANode *nextarc;    //指向下一条边的指针
        int weight;        //该边的权值等信息
    }  ArcNode;//边的结构体类型
    typedef struct Vnode {
        int data;        //顶点信息
        ArcNode *firstarc;    //指向第一条边
    }  VNode;//邻接表表头类型
    typedef struct {
        VNode adjlist[MAXN];    //邻接表
        int n,e;            //图中顶点数n和边数e
    } AdjGraph;//图的邻接表结构体类型
    void CreateAdj(AdjGraph *&G) ;
    void DFS(AdjGraph *G,int v) ;
    int main() {
        AdjGraph *G;//声明指针
        CreateAdj(G);
        DFS(G,0);
        return 0;
    }
    //接下来尝试非递归的方法构造深搜函数
    void CreateAdj(AdjGraph *&G) { //创建图的邻接表
    
        int i,j;
        int n;
        int A[MAXN][MAXN];
        printf("请输入矩阵的阶数:\n");
        scanf("%d",&n);
        printf("请输入一个%d*%d的邻接矩阵\n",n,n);
        for(i=0; i<n; i++)
            for(j=0; j<n; j++)
                scanf("%d",&A[i][j]);
    
        ArcNode *p;
        G=(AdjGraph *)malloc(sizeof(AdjGraph));
        for (i=0; i<n; i++) //给邻接表中所有头结点的指针域置初值
            G->adjlist[i].firstarc=NULL;
        for (i=0; i<n; i++)         //检查邻接矩阵中每个元素
            for (j=n-1; j>=0; j--)
                if (A[i][j]!=0 ) {   //存在一条边
                    n++;
                    p=(ArcNode *)malloc(sizeof(ArcNode)); //创建一个结点p
                    p->adjvex=j;               //存放邻接点
                    p->weight=A[i][j];            //存放边权
                    p->nextarc=G->adjlist[i].firstarc; //采用头插法插入结点p
                    G->adjlist[i].firstarc=p;
                }
        G->n=n;
    }
    void DFS(AdjGraph *G,int v) {
        ArcNode *p;
        int w;
        int Q[MAXN*10],top=0;
        Q[++top]=v;
        visited[v]=1;        //置已访问标记
        printf("%d  ",v);    //输出被访问顶点的编号
        p=G->adjlist[v].firstarc;//p指向顶点v的第一条边的边头结点
        bool flag=0;
        while(top>0) { //栈非空时
            v=Q[top];
            p=G->adjlist[v].firstarc;
            if(p) {
                w=p->adjvex;
                while(visited[w]&&p->nextarc!=NULL) { //该点被访问过,且下一个节点非空
                    p=p->nextarc;
                    w=p->adjvex;
                }
                if(visited[w]) {//如果相邻接点都被访问过 
                    top--;                
                    continue;            
                }printf("%d  ",w);    //输出被访问顶点的编号
                Q[++top]=w;
                visited[w]=1;
            }else//如果没有相邻节点 
            {
                top--;
                
                continue;
            }
        }
        return ; 
    }
    /*
    1 1 1 0
    1 1 0 1
    1 0 1 0
    0 1 0 1
    
    */
    非递归深搜
  • 相关阅读:
    Windows10如何添加开机启动项
    selenium自动化文件上传、文件下载
    windows下创建虚拟环境
    selenium 处理js日历控件
    selenium鼠标和键盘事件
    selenium绕过某宝验证,手动验证滑块
    python国内镜像源
    Linux下jenking安装
    发送邮件
    基于python的selenium两种文件上传操作
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/15567048.html
Copyright © 2011-2022 走看看