数据结构例程——图的遍历

本文是[数据结构基础系列(7):图]中第6课时[图的遍历]的例程。

1、深度优先遍历——DFS(程序中graph.h是图存储结构的“算法库”中的头文件,详情请单击链接…

#include <stdio.h>
#include <malloc.h>
#include "graph.h"
int visited[MAXV];
void DFS(ALGraph *G, int v)
{
    ArcNode *p;
    int w;
    visited[v]=1;
    printf("%d ", v);
    p=G->adjlist[v].firstarc;
    while (p!=NULL)
    {
        w=p->adjvex;
        if (visited[w]==0)
            DFS(G,w);
        p=p->nextarc;
    }
}

int main()
{
    int i;
    ALGraph *G;
    int A[5][5]=
    {
        {0,1,0,1,0},
        {1,0,1,0,0},
        {0,1,0,1,1},
        {1,0,1,0,1},
        {0,0,1,1,0}
    };
    ArrayToList(A[0], 5, G);

    for(i=0; i<MAXV; i++) visited[i]=0;
    printf(" 由2开始深度遍历:");
    DFS(G, 2);
    printf("\n");

    for(i=0; i<MAXV; i++) visited[i]=0;
    printf(" 由0开始深度遍历:");
    DFS(G, 0);
    printf("\n");
    return 0;
}

测试时用的图是,可以使用其他类型的图代替。

2、广度优先遍历——BFS(程序中graph.h是图存储结构的“算法库”中的头文件,详情请单击链接…

#include <stdio.h>
#include <malloc.h>
#include "graph.h"

void BFS(ALGraph *G, int v)
{
    ArcNode *p;
    int w,i;
    int queue[MAXV],front=0,rear=0; //定义循环队列
    int visited[MAXV];     //定义存放节点的访问标志的数组
    for (i=0; i<G->n; i++) visited[i]=0; //访问标志数组初始化
    printf("%2d",v);            //输出被访问顶点的编号
    visited[v]=1;                       //置已访问标记
    rear=(rear+1)%MAXV;
    queue[rear]=v;              //v进队
    while (front!=rear)         //若队列不空时循环
    {
        front=(front+1)%MAXV;
        w=queue[front];             //出队并赋给w
        p=G->adjlist[w].firstarc;   //找w的第一个的邻接点
        while (p!=NULL)
        {
            if (visited[p->adjvex]==0)
            {
                printf("%2d",p->adjvex); //访问之
                visited[p->adjvex]=1;
                rear=(rear+1)%MAXV; //该顶点进队
                queue[rear]=p->adjvex;
            }
            p=p->nextarc;       //找下一个邻接顶点
        }
    }
    printf("\n");
}

int main()
{
    ALGraph *G;
    int A[5][5]=
    {
        {0,1,0,1,0},
        {1,0,1,0,0},
        {0,1,0,1,1},
        {1,0,1,0,1},
        {0,0,1,1,0}
    };
    ArrayToList(A[0], 5, G);

    printf(" 由2开始广度遍历:");
    BFS(G, 2);

    printf(" 由0开始广度遍历:");
    BFS(G, 0);
    return 0;
}

测试时用的图是,可以使用其他类型的图代替。

时间: 2024-09-20 16:26:14

数据结构例程——图的遍历的相关文章

数据结构例程——用二叉树遍历思想解决问题

本文是数据结构基础系列(6):树和二叉树中第10课时二叉树的遍历的例程. [利用二叉树遍历思想解决问题](请利用二叉树算法库) 假设二叉树采用二叉链存储结构存储,分别实现以下算法,并在程序中完成测试: (1)计算二叉树节点个数: (2)输出所有叶子节点: (3)求二叉树b的叶子节点个数 (4)设计一个算法Level(b,x,h),返回二叉链b中data值为x的节点的层数. (5)判断二叉树是否相似(关于二叉树t1和t2相似的判断:①t1和t2都是空的二叉树,相似:②t1和t2之一为空,另一不为空

数据结构例程——图的邻接矩阵存储结构及算法

本文是[数据结构基础系列(7):图]中第4课时[图的邻接矩阵存储结构及算法]的例程. #include <stdio.h> #include <malloc.h> #define MAXV 100 /*最大顶点数设为100*/ #define LIMITLESS 9999 typedef struct { int no; //顶点编号 char info[20]; //顶点其他信息,类型视应用而定 } VertexType; //顶点类型 typedef struct //图的定义

C语言版的数据结构求图的遍历,但是调试时为什么会出现已停止工作?

问题描述 #include<stdio.h>#include<stdlib.h>#include<conio.h>#include<malloc.h>#defineNULL0#defineFALSE0#defineTRUE1#definemaxsize100structarcnode{intadjvex;intinfo;structarcnode*nextarc;};structvexnode{intdata;structarcnode*firstarc;}

数据结构实践——迷宫问题之图深度优先遍历解法

本文是针对[数据结构基础系列(7):图]的实践项目. [项目 - 迷宫问题之图深度优先遍历解法] 设计一个程序,采用深度优先遍历算法的思路,解决迷宫问题. (1)建立迷宫对应的图数据结构,并建立其邻接表表示. (2)采用深度优先遍历的思路设计算法,输出从入口(1,1)点到出口(M,N)的所有迷宫路径. [模型建立] 将迷宫中的每一格作为一个顶点,相邻格子可以到达,则对应的顶点之间存在边相连. 例如,下面的迷宫 在使用数组表示时,用0表示格子是空地,用1表示格子处是墙,对应的矩阵是: int mg

编程c语言-c语言版的数据结构中求图的遍历

问题描述 c语言版的数据结构中求图的遍历 调试时为什么会出现已停止工作??具体情况是出现了一个问题,导致程序停止正常工作,如果有可用的解决方案,Windiws将关闭程序并通知你 解决方案 贴出你的代码.代码是调试才能发现错误的.哪有看代码看出错误的. 你自己也要学会调试. 解决方案二: 数据结构(C语言版)规范代码之图(邻接多重表遍历)数据结构(C语言版)摘录--树和二叉树数据结构(C语言版)摘录--图 解决方案三: 看着真费劲.有malloc申请内存,没看到有free呢.

树的遍历与图的遍历

研发时候,不要受原来的术语的影响,其实就是想着原来学过的或者看过的可以解决新遇到的问题,这其实是侥幸心理,忘记原来的术语吧,那只是你创新的源泉. 遍历就是把节点按一定规则构成一个线性序列,不同的规则得到不同顺序的线性序列,仅此而已 . 算法是实际问题工作步骤的抽象,不要一味想算法,想想实际情况怎么做的,然后提取算法,然后优化. 不论怎样,要和具体的数据结构结合在一起. 一.树的遍历 对于树的遍历,有三种,就拿前序遍历来说,得到的序列不论怎么拆分(子串,就是要连续),始 终要是根左右,跟在左右前面

[非原创]树和图的遍历

       备注:本文使用的范例代码来自<系统设计师教程>(王春森主编),本文性质属于我的对引用代码的注释和分析,因此并非原创.本文的部分先发表于中国编程论坛.   (一)用栈前序遍历树   对这篇文章的来源性说明:理论和代码来源,<系统设计师教程>(王春森主编),文章内容来自我对书中代码的分析和手工注释. ( 本文献给小师妹:littlehead(我是大好人)) 名词:栈,遍历,前序遍历,树. (1)准备:树的定义省略.但是由于数的定义属于递归型定义,即树的每个子节点又是一棵树

图的遍历-(深度优先&amp;amp;广度优先)

1.调用代码入口: using System; namespace 图_图的遍历 { internal class Program { private static void Main(string[] args) { var a = new AdjacencyList<char>(); Console.WriteLine("1.初始化树结构:"); Console.WriteLine("================================="

关于返回值的问题(图的遍历),求解答啊

问题描述 关于返回值的问题(图的遍历),求解答啊 关于词语接龙,能否把所有的单词首尾连接起来(串成一条线即可,不需要围成环) 2 6 aloha arachnid dog gopher rat tiger 3 oak maple elm 为什么返回值是0:而不是 n..第一个完全可以首尾相连啊.求解答啊不会贴代码..就在这个里面 解决方案 find()函数是递归啊!最后一层的确返回了n,但是被你直接抛弃了啊!!你printf()打印的是第一层调用的返回值啊!!! 解决方案二: 说实话,关于递归我