注册 登录
编程论坛 数据结构与算法

关于图深度遍历的一个问题

发布于 2010-06-02 19:20, 703 次点击
代码如下:
#include <stdio.h>
#define MAXNODE  64

typedef char VertexType;
typedef int EdgeType;
typedef struct
{
     VertexType  vexs[MAXNODE];
     EdgeType arcs[MAXNODE][MAXNODE];
     int vexnum,arcnum;
}MGgraph;
int visited[MAXNODE];

MGgraph CreatMGgraph()
{
     MGgraph G;
     int i,j;
     VertexType x;
     G.vexnum=0;
     scanf("%c",&x);
     while(x!='#')
     {
         G.vexnum++;
         G.vexs[G.vexnum]=x;
         scanf("%c",&x);
     }
     G.arcnum=0;
     for(i=1;i<=G.vexnum;i++)
         for(j=1;j<=G.vexnum;j++)
         G.arcs[i][j]=0;
     scanf("%d",&i);
     scanf("%d",&j);
     while(i&&j)
    {
        G.arcs[i][j]=1;
        G.arcs[j][i]=1;
        G.arcnum++;
        scanf("%d",&i);
        scanf("%d",&j);
    }
    for(i=1;i<=G.vexnum;i++)
    G.arcs[i][i]=0;
    return G;
}

int first(MGgraph G,int v)
{
    int i;
    for(i=1;i<=G.vexnum;i++)
    if(G.arcs[v][i]!=0&&visited[i]==0) return i;
    return 0;
}

int next(MGgraph G,int v ,int w)
{
    int i;
    for(i=w;i<=G.vexnum;i++)
    if(G.arcs[v][i]!=0&&visited[i]==0) return i;
    return 0;
}

void DFS(MGgraph G,int v)
{
    int w;
    visited[v]=1;
    printf("%c",G.vexs[v]);
    for(w=first(G,v);w;w=next(G,v,w))
    if(!visited[w]) DFS(G,w);
}


void DFStraverse(MGgraph G)
{
    int v;
    for(v=1;v<=G.vexnum;v++)
    visited[v]=0;
    for(v=1;v<=G.vexnum;v++)
    if(!visited[v]) DFS(G,v);
}

int main()
{
    MGgraph G;
    G=CreatMGgraph();
    DFStraverse(G);
    return 0;
}
当我输入:abcdefgh#1 2 1 3 2 4 2 5 3 6 3 7 4 8 5 8 6 8 7 8 0 0 enter时
竟然出现abdhefcg
应该是abdghecfg才对啊?
5 回复
#2
hzh5122010-06-02 20:51
程序逻辑没有问题,结果是正确的,不过你的是错误的,回去翻翻课本,搞清楚什么是广度优先遍历和深度优先遍历!!
程序实现有点小问题:
直接 return G;太危险了,学会传引用!
void CreatMGgraph(MGgraph &G)
#3
2010-06-02 21:09
- -! 我打错了,不过输出序列也确实是错的。其实我自己找到错误了。。。。。
引用的话,不是同样改变原变量吗?和return G差不多啊,本人愚钝了,受教了。
#4
hzh5122010-06-02 21:18
不管怎样,输出到序列 abdhfcge 确实是此图的深度优先遍历!

不知你了解“临时对象”这个概念吗?你可以Google学习一下。
通过参数传引用,特别是const传递,是非常安全的,并且是一种高效的做法!
如果只是 return Obj; 会产生临时对象这是既不安全和低效的!
#5
2010-06-02 22:20
懂了,谢啦。
#6
jaq13187072010-06-24 23:34
临时对象是C++中的东西啊。C中不存在对象只之吧。返回MGgraph一个结构体,耗内存,结构体变量尽量用指针。
1