| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 522 人关注过本帖
标题:图的深度优先遍历~
只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
结帖率:99.25%
收藏
已结贴  问题点数:5 回复次数:2 
图的深度优先遍历~
继续练习数据结构~附上注释感觉有基础的不难理解~

程序代码:
#include<stdio.h>
#include<stdlib.h>

struct Node  /*图的结构体定义*/
{
    int vertex;      /*顶点数据信息*/

    struct Node* nextnode;    /*指下一顶点的指标*/
};

typedef struct Node* Graph;  /*图形的结构新形态*/

struct Node head[9]={0};     /*图形顶点数组*/

int visited[9]={0};         /*遍历记录数组*/

/*根据已有的信息建立邻接表*/

void creatgraph(int node[20][2],int num);  /*num指的是图的边数*/


void dfs(int current);/*图的深度优先搜寻法*/



int main()
{
    Graph ptr=NULL;

    int node[20][2]=
    {
        {1,3},{3,1},
        {1,4},{4,1},
        {2,5},{5,2},
        {2,6},{6,2},
        {3,7},{7,3},
        {4,7},{7,4},
        {5,8},{8,5},
        {6,7},{7,6},
        {7,8},{8,7},
    };

    int i=0;

    for (i=1;i!=9;++i)
    {
        head[i].vertex=i;       /*设定顶点值*/
        head[i].nextnode=NULL;  /*指针为空*/

        visited[i]=0;          /*设定遍历初始标志*/
    }

    creatgraph(node,20);  /*建立邻接表*/

    puts("Content of the graph's ADlist is");

    for (i=1;i!=9;++i)
    {
        printf("vertex%d->",head[i].vertex);  /*顶点值*/

        ptr=head[i].nextnode;  /*顶点位置*/

        while (ptr!=NULL)
        {
            printf("%d ",ptr->vertex);  /*印出顶点内容*/

            ptr=ptr->nextnode;    /*下一个顶点*/
        }

        puts("");  /*换行*/

    }

    puts("\nThe end of the def are:");

    dfs(1);   /*打印遍历输出过程*/

    puts("");  /*换行*/

    return 0;
}

void creatgraph(int node[20][2],int num)  /*num指的是图的边数*/
{
    Graph newnode=NULL;/*指向新节点的指针*/

    Graph ptr=NULL;

    int from=0;    /*边的起点*/
    int to=0;      /*边的终点*/
    int i=0;       

    for (i=0;i!=num;++i)
    {
        from=node[i][0];   /*边的起点*/
        to=node[i][1];     /*边的终点*/

        /*建立新的顶点*/

        newnode=(Graph)malloc(sizeof (struct Node));

        newnode->vertex=to;     /*建立顶点内容*/

        newnode->nextnode=NULL; /*设置指标初值*/

        ptr=&(head[from]);      /*顶点位置*/

        while (ptr->nextnode!=NULL)  /*遍历至链表结尾*/
            ptr=ptr->nextnode;

        ptr->nextnode=newnode;     /*插入节点*/
    }

}

void dfs(int current)
{
    Graph ptr=NULL;

    visited[current]=1;  /*记录遍历过的数据*/

    printf("vertex[%d]\n",current);   /*输出遍历顶点值*/

    ptr=head[current].nextnode;       /*顶点位置*/

    while (ptr!=NULL)
    {
        if (visited[ptr->vertex]==0)  /*如果没有遍历过*/
            dfs(ptr->vertex);         /*递归遍历呼叫*/

        ptr=ptr->nextnode;            /*下一个顶点*/
    }
}


PS:感觉这是一个无向图~如果把二维数组的倒过来赋值部分去掉就变成有向图了~
2017-03-10 17:45
mnmn4429
Rank: 4
等 级:业余侠客
帖 子:64
专家分:245
注 册:2017-2-21
收藏
得分:5 
好像看不懂有什么用
但应该是不错的代码
2017-03-10 18:00
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
附加图的深度遍历说明:

图片附件: 游客没有浏览图片的权限,请 登录注册


大概就是这个样子了~~




[此贴子已经被作者于2017-3-10 18:37编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-10 18:27
快速回复:图的深度优先遍历~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015614 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved