| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 644 人关注过本帖
标题:关于邻接表的深度优先遍历,自己写了个小程序,无法实现,求大鸟们指教
只看楼主 加入收藏
世界模型
Rank: 4
等 级:业余侠客
威 望:1
帖 子:240
专家分:226
注 册:2010-9-12
结帖率:97.44%
收藏
已结贴  问题点数:30 回复次数:3 
关于邻接表的深度优先遍历,自己写了个小程序,无法实现,求大鸟们指教
#include<iostream.h>
#include<string.h>
#include<stdlib.h>
#define MAX_VERTEX_NUM 20
typedef char VertexType[5];
typedef struct ArcNode {
    int adjvex;    //边所指向的顶点的位置
    struct ArcNode *nextarc;
    int weight;//表示权
} ArcNode;
typedef struct VNode {
 
    VertexType data;
    ArcNode  *firstarc;
} VNode;
typedef struct {
    VNode vertices[MAX_VERTEX_NUM];// 注意
    int vexnum, arcnum;
} ALGraph;
void Init_ALGraph(ALGraph &G)
{
    cout<<"输入图的顶点数:";
    cin>>G.vexnum;
    cout<<"输入图的边数:";
    cin>>G.arcnum;
    int i;
    cout<<"输入定点值:";
    for(i=0;i<G.arcnum;++i)    //构造表头向量
    {
        cin>>G.vertices[i].data;//输入顶点值        
        G.vertices[i].firstarc=NULL;//初始化链表头指针为“空”
    }
}
//获取定点在定点向量中的位置 如果出错就终止运行
int Get_Vertex_Location( ALGraph G, VertexType v )
{
    int i;
    for( i=0; i<G.vexnum; ++i )
        if( strcmp( v, G.vertices[i].data ) == 0 )
            return i;
    exit(0);
}
void CreatUDG(ALGraph &G)
{
    int i,j,k;
    Init_ALGraph(G);
    VertexType v1,v2;
    cout<<"输入图的边:";

    for(k=0;k<G.arcnum;++k)        //输入各边并构造邻接表
    {   
   
        
        cin>>v1>>v2;                //输入一条弧的始点和终点
        i=Get_Vertex_Location( G, v1 );    //确定i和j在G中位置,即顶点的序号

        j=Get_Vertex_Location( G, v2 );
        ArcNode *pi,*pj;
        pi=(ArcNode*)malloc(sizeof(ArcNode));
        pi->adjvex=j;    //对弧结点赋邻接点位置信息
        pi->nextarc=G.vertices[i].firstarc; G.vertices[i].firstarc=pi;    //插入链表G.vertices[i]
        
        pj=(ArcNode*)malloc(sizeof(ArcNode));
        pj->adjvex=i;    //
        pj->weight=0;
        pj->nextarc=G.vertices[j].firstarc; G.vertices[j].firstarc=pj;     // 插入链表G.vertices[j]
    }
}
void DFSTraverse(ALGraph G,bool *&visited,int i,int n)
{
    //cout<<i<<'';
    //bool *&visited=new bool[n];
    visited[i]=true;
    ArcNode *p;
    p = G.vertices[i].firstarc;
    while(p!=NULL)
    {
        int j=p->adjvex;
        if(!visited[j])
            {
                DFSTraverse(G,visited,j,n);
                p=p->nextarc;
            }
    }

}
void Print_ALGraph(ALGraph G)
{
    int i;
    for(i=0;i<G.vexnum;++i)
    {   
        ArcNode *p=G.vertices[i].firstarc;
        while(p)
        {
            cout<<G.vertices[i].data;
            cout<<G.vertices[p->adjvex].data;
        }
        p=p->nextarc;


    }   
   

   
}
int main()
{
    ALGraph G;
    int i,n;
            CreatUDG(G);
            Print_ALGraph( G );
    bool*visited=new bool[n];
        for(i=1;i<=n;i++)
            visited[i]=false;
        DFSTraverse(G,visited,1,n);

    return 0;
}


搜索更多相关主题的帖子: 遍历 深度 指教 
2010-11-22 18:32
世界模型
Rank: 4
等 级:业余侠客
威 望:1
帖 子:240
专家分:226
注 册:2010-9-12
收藏
得分:0 
跪求!!!
2010-11-22 18:32
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:30 
//.cpp文件
//说明的是 这里的深度遍历 没有具备一般性
/*关于邻接表的深度优先遍历*/
#include<iostream.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>

#define MAX_VERTEX_NUM 20

typedef char VertexType[5];

typedef struct ArcNode
{
//    int weight;//表示权
    int adjvex;    //边所指向的顶点的位置
    struct ArcNode *nextarc;   
} ArcNode;

typedef struct VNode
{
    VertexType data;
    ArcNode  *firstarc;
}VNode;

typedef struct
{
    VNode vertices[MAX_VERTEX_NUM];// 注意
    int vexnum, arcnum;
} ALGraph;

void Init_ALGraph(ALGraph &G)
{
    cout<<"输入图的顶点数:";
    cin>>G.vexnum;
    cout<<"输入图的边数:";
    cin>>G.arcnum;
    int i;
    cout<<"输入定点值:";
    //for(i=0;i<G.arcnum;++i)    //构造表头向量
    for(i=0; i<G.vexnum; ++i)
    {
        cin>>G.vertices[i].data;//输入顶点值        
        G.vertices[i].firstarc=NULL;//初始化链表头指针为“空”
    }
}
//获取定点在定点向量中的位置 如果出错就终止运行
int Get_Vertex_Location( ALGraph G, VertexType v )
{
    int i;
    for( i=0; i<G.vexnum; ++i )
        if( strcmp( v, G.vertices[i].data ) == 0 )
            return i;
    exit(0);
}

void CreatUDG(ALGraph &G)
{
    int i,j,k;
    Init_ALGraph(G);
    VertexType v1,v2;
    cout<<"输入图的边:";

    for(k=0;k<G.arcnum;++k)        //输入各边并构造邻接表
    {   
   
        
        cin>>v1>>v2;                //输入一条弧的始点和终点
        i=Get_Vertex_Location( G, v1 );    //确定i和j在G中位置,即顶点的序号

        j=Get_Vertex_Location( G, v2 );
        ArcNode *pi,*pj;
        pi=(ArcNode*)malloc(sizeof(ArcNode));
        pi->adjvex=j;    //对弧结点赋邻接点位置信息
        pi->nextarc=G.vertices[i].firstarc; G.vertices[i].firstarc=pi;    //插入链表G.vertices[i]
        
        pj=(ArcNode*)malloc(sizeof(ArcNode));
        pj->adjvex=i;    //
       // pj->weight=0;
        pj->nextarc=G.vertices[j].firstarc; G.vertices[j].firstarc=pj;     // 插入链表G.vertices[j]
    }
}

//void DFSTraverse(ALGraph G,bool *&visited,int i,int n)
void DFSTraverse(ALGraph G, bool *&visited, int i)
{//i为开始点
    //cout<<i<<'';
    //bool *&visited=new bool[n];
    visited[i]=true;
    ArcNode *p;

    cout << G.vertices[i].data << ' ';/*输出访问点*/
//    printf("%s ", G.vertices[i].data);

    p = G.vertices[i].firstarc;
    while(p!=NULL)
    {
        int j=p->adjvex;
        if(!visited[j])
        {
             DFSTraverse(G,visited,j);     
        }
        p=p->nextarc;
    }
}

void Print_ALGraph(ALGraph G)
{
    int i;
    for(i=0;i<G.vexnum;++i)
    {   
        ArcNode *p=G.vertices[i].firstarc;
        while(p)
        {
            cout<<G.vertices[i].data << "--";
            cout<<G.vertices[p->adjvex].data << endl;
            p = p->nextarc;
        }
       //p=p->nextarc;
    }         
}

int main()
{
    ALGraph G;
    //int i,n;
    int i;
    CreatUDG(G);
    Print_ALGraph( G );
   // bool*visited=new bool[n];
    bool *visited = new bool[G.vexnum];/*定义定点是否访问过的标志数组 TRUE 表示访问过 否则false*/
    //for(i=1;i<=n;i++)
    for(i=0; i<G.vexnum; ++i)/*初始化访问标志数组 为未访问值*/
        visited[i] = false;
   //DFSTraverse(G,visited,1,n);
    DFSTraverse(G, visited, 1);
   
    cout << endl;
    return 0;
}

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

2010-11-22 22:50
世界模型
Rank: 4
等 级:业余侠客
威 望:1
帖 子:240
专家分:226
注 册:2010-9-12
收藏
得分:0 
谢谢了!
2010-11-23 11:50
快速回复:关于邻接表的深度优先遍历,自己写了个小程序,无法实现,求大鸟们指教 ...
数据加载中...
 
   



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

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