无向图的深度优先遍历和广度优先遍历(邻接链表)

我选的是邻接链表,建立如下图所示的图:

无向图的深度优先遍历和广度优先遍历(邻接链表)_第1张图片


我把它画出来,图是这样子的:


无向图的深度优先遍历和广度优先遍历(邻接链表)_第2张图片


对于深度优先遍历:是从一个顶点v出发,一步一步地向前推进,当找不到未访问过的顶点时,也是一步一步地回退。其过程类似于用栈求解迷宫问题的搜索方式。


比如上面这个图:我从4这个顶点开始遍历,它先访问它第一个邻接点1,然后1访问它的第一个邻接点4,发现4已经访问过了,然后访问第二个邻接点2,2访问第一个邻接点1,发现1已经被访问过,回退到1,1访问第三个邻接点3,3的第一个第二个邻接点已经被访问,我们就不访问它,最后回退到4,4访问第二个邻接点3,可是3已经被访问,我们就不访问了。


对于广度优先遍历:是从一个顶点v出发,先访问其所有相邻的未访问过的顶点。相当于以初始点为中心,一层一层地向外推进的。其过程类似于用队列求解迷宫问题的搜索方式。


比如上面这个图:我从4这个顶点开始访问,先访问1,接着访问3,然后访问和3相邻的顶点4、1,4、1都被访问过,回退访问1相邻的未访问的顶点1。



我是这样理解的,读者可以根据自己的测试数据来理解,欢迎和我交流。


完整代码:

    #include   
    #include   
    #include   
    #define MAX_NUM 20  
    typedef struct ArcNode {  
        int adjvex;  
        struct ArcNode *nextarc;  
    }ArcNode;  
    typedef int VertexType;  
    typedef struct VNode {  
        VertexType data;  
        ArcNode *firstarc;  
    }VNode,AdjList[MAX_NUM];  
    void createDgraph(AdjList &g,int n){  
        ArcNode *p,*q;  
        int i,j;  
        for (i=1;i<=n;i++)  
        {  
            g[i].data=i;  
            g[i].firstarc=NULL;  
        }  
        printf("\nEdgei->j:");  
        scanf("%d%d",&i,&j);  
        while (i!=-1)  
        {  
            p=(ArcNode *)malloc(sizeof(ArcNode));  
			q=(ArcNode *)malloc(sizeof(ArcNode));  
            p->adjvex=j;  
            p->nextarc=g[i].firstarc;  
            g[i].firstarc=p;  
			 q->adjvex=i;  
            q->nextarc=g[j].firstarc;  
            g[j].firstarc=q;  
            printf("\nEdge i->j:");  
            scanf("%d%d",&i,&j);  
        }  
    }  
	int visited[MAX_NUM]={0};
	void DFS(AdjList G,int v){
		ArcNode *p;
		visited[v]=1;
		printf("%d ",v);
		p=G[v].firstarc;
		while(p!=NULL){
			if(visited[p->adjvex]==0){//若w=p->adjvex 顶点未访问,递归访问它
				DFS(G,p->adjvex);
			}
			p=p->nextarc;//p指向顶点v的下一个邻接点
		}
	}

	void BFS(AdjList G,int v){
		ArcNode *p;
		int Qu[20],front,rear;//定义循环队列
		int visited[20]={0};
		int w,i;
		front=rear=0;//初始化队列
		printf("%d ",v);
		visited[v]=1;
		rear=(rear+1)%20;
		Qu[rear]=v;//v进队
		while(front!=rear){
			front=(front+1)%20;
			w=Qu[front];//出队并赋给w
			p=G[w].firstarc;//找与顶点w邻接的第一个顶点
			while(p){
				if(visited[p->adjvex]==0){//弱当前顶点未被访问
					printf("%d ",p->adjvex);//访问邻接顶点
					visited[p->adjvex]=1;
					rear=(rear+1)%20;//该顶点进队
					Qu[rear]=p->adjvex;
				}
				p=p->nextarc;
			}
		}
	}
    void printDgraph(AdjList g,int n){  
        ArcNode *p;  
        int i;  
        for (i=1;i<=n;i++)  
        {  
            printf("\n%d: ",g[i].data);  
            p=g[i].firstarc;  
            while (p)  
            {  
                printf("->%d",p->adjvex);  
                p=p->nextarc;  
            }  
        }  
    }  
    int main()  
    {  
        AdjList g;  
        int num;  
        printf("Input Number of Vertex:");  
        scanf("%d",&num);  
        createDgraph(g,num);  
        printDgraph(g,num);  
        printf("\n");  
		printf("深度优先:");
		DFS(g,num);
		printf("\n");
		printf("广度优先:");
		BFS(g,num);
		printf("\n");
        return 0;  
    }  




对于图的管

你可能感兴趣的:(C语言)