邻接表储存图+深度搜索遍历 ——数据结构课程

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

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

 

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

*/
非递归深搜

 

posted @ 2021-11-17 14:12  浪矢-CL  阅读(59)  评论(0编辑  收藏  举报