| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 604 人关注过本帖
标题:不知道是不是出了逻辑错误,遍历不了,求关注
只看楼主 加入收藏
世界模型
Rank: 4
等 级:业余侠客
威 望:1
帖 子:240
专家分:226
注 册:2010-9-12
结帖率:97.44%
收藏
已结贴  问题点数:80 回复次数:9 
不知道是不是出了逻辑错误,遍历不了,求关注
程序代码:
/*
*图的深度优先搜索
*/
#include<stdio.h>//EOF(=^Z或F6),NULL
#include<stdlib.h>
#include<string.h>

#define MAX_NAME 5//顶点字符串的最大长度+1
#define MAX_INFO 20//相关信息字符串的最大长度+1

typedef int VRType;
typedef char InfoType;
typedef char VertexType[MAX_NAME];
typedef int Boolean;

#define MAX_VEX_NUM 20


typedef struct
{
    VRType adj;//顶点关系类型
    InfoType *info;//该弧相关信息的指针
}ArcCell,AdjMatrix[MAX_VEX_NUM][MAX_VEX_NUM];
typedef struct
{
    VertexType vexs[MAX_VEX_NUM];
    AdjMatrix arcs;
    int vexnum,arcnum;//当前顶点数和弧数
}MGraph;

/* 初始条件:图G存在,u和G中顶点有相同特征 */
  /* 操作结果:若G中存在顶点u,则返回该顶点在图中位置;否则返回-1 */
int getLocateVex(MGraph G,VertexType u)
{
    int i;
    for(i=0;i<G.vexnum;++i)
        if(strcmp(u,G.vexs[i])==0)
            return  i;
    return 1;
}
/* 采用数组(邻接矩阵)表示法,构造无向图G */
int createUDG(MGraph *G)
{
    int i,j,k,l,IncInfo;
    char s[MAX_INFO],*info;
    VertexType va,vb;

    printf("请输入无向图G的顶点数,边数,边是否含有其他信息(是:1,否:0)");
    scanf("%d%d%d",&(*G).vexnum,&(*G).arcnum,&IncInfo);

    printf("请输入%d个顶点的值(<%d个字符)",(*G).vexnum,MAX_NAME);
    for(i=0;i<(*G).vexnum;++i)//构造顶点向量
        scanf("%s",(*G).vexs[i]);

    for(i=0;i<(*G).vexnum;++i)
        for(j=0;j<(*G).vexnum;++j)
        {
            (*G).arcs[i][j].adj=0;
            (*G).arcs[i][j].info=NULL;
        }

    printf("请输入%d条边的顶点1 顶点2(以空格作为间隔):\n",(*G).arcnum);
    for(k=0;k<(*G).arcnum;++k)
    {
        scanf("%s%s%*c",va,vb);//%*c吃掉回车符
        i=getLocateVex(*G,va);
        j=getLocateVex(*G,vb);
        (*G).arcs[i][j].adj=(*G).arcs[j][i].adj=1;//无向图

        if(IncInfo)
        {
            printf("请输入该边的相关信息(<%d个字符):",MAX_INFO);
            gets(s);
            l=strlen(s);

            if(l)
            {
                info=(char *)malloc((l+1)*sizeof(char));
                strcpy(info,s);
                (*G).arcs[i][j].info=(*G).arcs[j][i].info=info;//无向图
            }
        }
    }

    return 1;
}

/* 初始条件: 图G存在,v是G中某个顶点的序号。操作结果: 返回v的值 */
VertexType* GetVex(MGraph G,int v)
{
    if(v>=G.vexnum||v<0)
        exit(0);
    return &G.vexs[v];
}
/* 初始条件: 图G存在,v是G中某个顶点 */

 /* 操作结果: 返回v的第一个邻接顶点的序号。若顶点在G中没有邻接顶点,则返回-1 */
int FirstAdjVex(MGraph G,VertexType v)
{
    int i,j=0,k;
    k=getLocateVex(G,v);
    for(i=0;i<G.vexnum;i++)//k为顶点v在图G中的序号
        if(G.arcs[k][i].adj!=j)
            return i;
    return -1;
}
/* 初始条件: 图G存在,v是G中某个顶点,w是v的邻接顶点 */
/* 操作结果: 返回v的(相对于w的)下一个邻接顶点的序号, */
/*           若w是v的最后一个邻接顶点,则返回-1 */
int NextAdjVex(MGraph G,VertexType v,VertexType w)
{
    int i,j=0,k1,k2;
    k1=getLocateVex(G,v);//k1为顶点v在图G中的序号
    k2=getLocateVex(G,w);//k2为顶点w在图G中的序号
    for(j=k2+1;i<G.vexnum;i++)
        if(G.arcs[k1][i].adj!=j)
            return i;

    return 1;
}
Boolean visited[MAX_VEX_NUM];//访问标志数组
int (*VisitFunc)(VertexType);//函数变量
/* 从第v个顶点出发递归地深度优先遍历图G*/
void DFS(MGraph G,int v)
{
    VertexType w1,v1;
    int w;
    visited[v]=1;//设访问标志为已访问
    VisitFunc(G.vexs[v]);//访问第v个顶点

    for(w=FirstAdjVex(G,v1);w>=0;w=NextAdjVex(G,v1,strcpy(w1,*GetVex(G,w))))
        if(!visited[w])
            DFS(G,w);//对v的尚未访问的序号为w的邻接顶点递归调用DFS

}

/* 初始条件: 图G存在,Visit是顶点的应用函数。*/
/* 操作结果: 从第1个顶点起,深度优先遍历图G,并对每个顶点调用函数Visit */

 /*           一次且仅一次。一旦Visit()失败,则操作失败 */
void DFSTraverse(MGraph G,int(*Visit)(VertexType))
{
    int v;
    VisitFunc=Visit;//使用全局变量VisitFunc,使DFS不必设函数指针参数
    for(v=0;v<G.vexnum;v++)
        visited[v]=0;//访问数组初始化(未访问)
    for(v=0;v<G.vexnum;v++)
        if(!visited[v])
            DFS(G,v);//对未访问的顶点调用DFS
    printf("\n\n");
}

int visit(VertexType v)
{
    printf("%s ",v);
    return 1;
}

int main()
{
    MGraph G;

    createUDG(&G);
    printf("图的优先深度搜索:");
    DFSTraverse(G,visit);

    return 0;

}


[ 本帖最后由 世界模型 于 2011-8-8 18:46 编辑 ]
搜索更多相关主题的帖子: 搜索 include 
2011-08-08 18:43
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
分也真高。。。
2011-08-08 21:17
世界模型
Rank: 4
等 级:业余侠客
威 望:1
帖 子:240
专家分:226
注 册:2010-9-12
收藏
得分:0 
strcpy(v1,*GetVex(G,v))
v1忘了赋值了
可是还是遍历不了
2011-08-08 21:19
世界模型
Rank: 4
等 级:业余侠客
威 望:1
帖 子:240
专家分:226
注 册:2010-9-12
收藏
得分:0 
for(i=k2+1;i<G.vexnum;i++)
哎,不解释
遍历的顺序依然不对
2011-08-08 21:51
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:80 
但程序写得不怎么好  得继续加油
2011-08-08 22:04
世界模型
Rank: 4
等 级:业余侠客
威 望:1
帖 子:240
专家分:226
注 册:2010-9-12
收藏
得分:0 
版主给看看吧,我是真的找不出了
2011-08-08 22:21
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
程序代码:
/*
*图的深度优先搜索
*/
#include<stdio.h>//EOF(=^Z或F6),NULL
#include<stdlib.h>
#include<string.h>

#define MAX_NAME 5//顶点字符串的最大长度+1
#define MAX_INFO 20//相关信息字符串的最大长度+1

typedef int VRType;
typedef char InfoType;
typedef char VertexType[MAX_NAME];
typedef int Boolean;

#define MAX_VEX_NUM 20


typedef struct
{
    VRType adj;//顶点关系类型
    InfoType *info;//该弧相关信息的指针
}ArcCell,AdjMatrix[MAX_VEX_NUM][MAX_VEX_NUM];

typedef struct
{
    VertexType vexs[MAX_VEX_NUM];
    AdjMatrix arcs;
    int vexnum, arcnum;//当前顶点数和弧数
}MGraph;

/* 初始条件:图G存在,u和G中顶点有相同特征 */
  /* 操作结果:若G中存在顶点u,则返回该顶点在图中位置;否则返回-1 */
int getLocateVex(MGraph G, VertexType u)
{
    int i;

    for ( i=0; i<G.vexnum; ++i )
    {
        if (strcmp(G.vexs[i], u) == 0)
        {
            return i;
        }
    }

    return -1;
}
/* 采用数组(邻接矩阵)表示法,构造无向图G */
int createUDG(MGraph *G)
{
    int i,j,k,l,IncInfo;
    char s[MAX_INFO],*info;
    VertexType va,vb;

    printf("请输入无向图G的顶点数,边数,边是否含有其他信息(是:1,否:0)");
    scanf("%d%d%d",&(*G).vexnum,&(*G).arcnum,&IncInfo);

    printf("请输入%d个顶点的值(<%d个字符)",(*G).vexnum,MAX_NAME);
    for(i=0;i<(*G).vexnum;++i)//构造顶点向量
        scanf("%s",(*G).vexs[i]);

    for(i=0;i<(*G).vexnum;++i)
        for(j=0;j<(*G).vexnum;++j)
        {
            (*G).arcs[i][j].adj=0;
            (*G).arcs[i][j].info=NULL;
        }

    printf("请输入%d条边的顶点1 顶点2(以空格作为间隔):\n",(*G).arcnum);
    for(k=0;k<(*G).arcnum;++k)
    {
        scanf("%s%s",va,vb);
        i=getLocateVex(*G,va);
        j=getLocateVex(*G,vb);
        if (i<0 || j<0)
        {
            printf("输入的节点不匹配!\n");
        }
        (*G).arcs[i][j].adj=(*G).arcs[j][i].adj=1;//无向图

        if(IncInfo)
        {
            printf("请输入该边的相关信息(<%d个字符):",MAX_INFO);
            gets(s);
            l=strlen(s);

            if(l)
            {
                info=(char *)malloc((l+1)*sizeof(char));
                strcpy(info,s);
                (*G).arcs[i][j].info=(*G).arcs[j][i].info=info;//无向图
            }
        }
    }

    return 1;
}

/* 初始条件: 图G存在,v是G中某个顶点 */
/* 操作结果: 返回v的第一个邻接顶点的序号。若顶点在G中没有邻接顶点,则返回-1 */
int FirstAdjVex(MGraph G,VertexType v)
{
    int i, k;

    k = getLocateVex(G, v);
    for( i=0; i<G.vexnum; i++)//k为顶点v在图G中的序号
    {
        if (G.arcs[k][i].adj != 0)
        {
            return i;
        }
    }

    return -1;
}
/* 初始条件: 图G存在,v是G中某个顶点,w是v的邻接顶点 */
/* 操作结果: 返回v的(相对于w的)下一个邻接顶点的序号, */
/*           若w是v的最后一个邻接顶点,则返回-1 */
int NextAdjVex(MGraph G,VertexType v,VertexType w)
{
    int i = 0, k1,k2;

    k1=getLocateVex(G,v);//k1为顶点v在图G中的序号
    k2=getLocateVex(G,w);//k2为顶点w在图G中的序号

    for(i=k2+1;i<G.vexnum;i++)
    {
        if(G.arcs[k1][i].adj != 0)
        {
            return i;
        }
    }

    return -1;
}

Boolean visited[MAX_VEX_NUM];//访问标志数组
int (*VisitFunc)(VertexType);//函数变量
/* 从第v个顶点出发递归地深度优先遍历图G*/
void DFS(MGraph G,int v)
{
    int w;
    visited[v]=1;//设访问标志为已访问
    VisitFunc(G.vexs[v]);//访问第v个顶点

    for ( w=FirstAdjVex(G, G.vexs[v]); w>=0; w=NextAdjVex(G, G.vexs[v], G.vexs[w]) )
    {
        if (!visited[w])
        {
            DFS(G, w);
        }
    }

}

/* 初始条件: 图G存在,Visit是顶点的应用函数。*/
/* 操作结果: 从第1个顶点起,深度优先遍历图G,并对每个顶点调用函数Visit */
/*           一次且仅一次。一旦Visit()失败,则操作失败 */
void DFSTraverse(MGraph G,int(*Visit)(VertexType))
{
    int v;
    VisitFunc=Visit;//使用全局变量VisitFunc,使DFS不必设函数指针参数
    for(v=0;v<G.vexnum;v++)
        visited[v]=0;//访问数组初始化(未访问)
    for(v=0;v<G.vexnum;v++)
        if(!visited[v])
            DFS(G,v);//对未访问的顶点调用DFS
    printf("\n\n");
}

int visit(VertexType v)
{
    printf("%s ",v);

    return 1;
}

int main()
{
    MGraph G;

    createUDG(&G);
    printf("图的优先深度搜索:");
    DFSTraverse(G,visit);

    return 0;

}



先把 这个程序的 试着找到一个错误的用例  不然都不知道哪儿有问题
2011-08-08 22:42
世界模型
Rank: 4
等 级:业余侠客
威 望:1
帖 子:240
专家分:226
注 册:2010-9-12
收藏
得分:0 
没明白你意思
2011-08-08 22:57
世界模型
Rank: 4
等 级:业余侠客
威 望:1
帖 子:240
专家分:226
注 册:2010-9-12
收藏
得分:0 
恩恩,我懂啦
谢谢
2011-08-08 23:00
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
在vc中运行下7楼中的代码   然后给一组输入后出错的数据

然后就可以根据这组数据再来调试
2011-08-08 23:01
快速回复:不知道是不是出了逻辑错误,遍历不了,求关注
数据加载中...
 
   



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

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