标题:图的遍历有问题
只看楼主
unicorn
Rank: 4
等 级:贵宾
威 望:14
帖 子:1066
专家分:0
注 册:2005-10-25
 问题点数:0 回复次数:5 
图的遍历有问题

#include<iostream.h>
#include<stdlib.h>
#include"SqQueue.h"//队列的头文件,肯定没有错误
#define ok 1
#define error 0
typedef int status;
#define max 20// 定义最大顶点个数
#define INFINITY 1000 //定义无穷大
bool visited[max]; //访问标志数组
typedef char VertexType;
typedef struct ArcNode //弧结点的定义,表节点
{
int adjvex;//节点位置
struct ArcNode *nextarc;//下一条弧的指针
}ArcNode;
typedef struct VNode// 顶点结构体定义
{
VertexType data;//节点包含的数据
ArcNode *firstarc;//指向第一条弧的指针
}VNode,AdjList[max];

typedef struct //图的定义
{
AdjList vertices;
int vexnum,arcnum;
int kind;
}ALGraph;
void CreateALG(ALGraph &G)//采用邻接表创建图
{
int i;//变量
cout<<"输入顶点数"<<endl;
cin>>G.vexnum;
cout<<"输入边数"<<endl;
cin>>G.arcnum;
for(i=0;i<G.vexnum;i++)// 输入顶点信息
{
cout<<"请输入第"<<i<<": 个顶点信息--字符形式"<<endl;
cin>>G.vertices[i].data;
G.vertices[i].firstarc=NULL;
}//到词为止创建了一个数组保存节点,个数为G.vexnum
for(i=0;i<G.vexnum;i++)//生成树
{
int index=-1;
ArcNode *r,*p;//r指向当前链表的最后一个表结点;
while(true)
{
cout<<"输入第"<<i<<"个顶点的邻接点下标"<<endl;
cout<<"输入-1表示第i个顶点的单链表结束"<<endl;
cin>>index;
if(index==-1)
break;
else //尾插法建单链表
{
p=(ArcNode *)malloc(sizeof(ArcNode));
p->nextarc=NULL;
p->adjvex=index;
if(G.vertices[i].firstarc==NULL)
r=p;
else
{
r->nextarc=p;
r=r->nextarc;
}
//尾插法建单链表储存弧来建立图
}
}
}

}
int FirstAdjVex(ALGraph G,int v)
{ return (G.vertices[v].firstarc!=NULL)?G.vertices[v].firstarc->adjvex:-1;//查找第v个顶点的第一个临接点所在的下标,若没有则返回-1.
}
int NextAdjVex(ALGraph G,int v,int w)
{ ArcNode *q;
q=G.vertices[v].firstarc;
while(q)
{
if(G.vertices[q->adjvex].data==w)
if(q->nextarc)
return G.vertices[q->nextarc->adjvex].data;
else return -1;
q=q->nextarc;
}
return -1;

} //查找G中第v个顶点的单链表中,值为w的下一个表结点的值,若没有则返回-1.
void DFS(ALGraph G,int v); //DFS函数声明
void DFSTraverse(ALGraph G) //图的深度优先搜索
{
for(int v=0;v<G.vexnum;++v)
visited[v]=false;
for(v=0;v<G.vexnum;++v)
{ if(!visited[v])
{
DFS(G,v);
}
}
}
void DFS(ALGraph G,int v)
{
visited[v]=true;

cout<<G.vertices[v].data<<endl;//输出第v个顶点的数据
for(int w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
{
if(!visited[w])
DFS(G,w);
}
}
void BFSTraverse(ALGraph G)
{
SqQueue Q;
for(int v=0;v<G.vexnum;v++)
visited[v]=false;
InitQueue(Q);
for(v=0;v<G.vexnum;v++)
{
int u;
if(!visited[v])
{
visited[v]=true;
cout<<G.vertices[v].data<<endl;
EnQueue(Q,v);//将v入队
while(!QueueEmpty(Q))
{
DeQueue(Q,u);//出队一个元素放到u中
for(int w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w))
{
if(!visited[w])
{
visited[w]=true;
cout<<G.vertices[w].data<<endl;
EnQueue(Q,w);
}
}
}
}
}
}
void main()
{
ALGraph g;
CreateALG(g);//采用邻接表存储图
cout<<"深度优先遍历图"<<endl;
DFSTraverse(g);//深度优先遍历图
cout<<"广度优先遍历图"<<endl;
BFSTraverse(g);//广度优先遍历图
}

------------------------------------------
程序没有语法和调试错误但不能实现所要求的功能
帮偶看一下 是建立图时有错误嘛 thx

搜索更多相关主题的帖子: 遍历 typedef define 定义 ArcNode 
2006-05-16 17:31
maozhibin911
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2005-12-28
得分:0 

#include"stdio.h"
#include"stdlib.h"
#define MaxVertexNum 100 //定义最大顶点数
typedef struct{
char vexs[MaxVertexNum]; //顶点表
int edges[MaxVertexNum][MaxVertexNum]; //邻接矩阵,可看作边表
int n,e; //图中的顶点数n和边数e
}MGraph; //用邻接矩阵表示的图的类型
/*执行顺序:
Input VertexNum(n) and EdgesNum(e): 8,9
Input Vertex string: 01234567
Input edges,Creat Adjacency Matrix
0 1
0 2
1 3
1 4
2 5
2 6
3 7
4 7
5 6
Print Graph DFS: 01374256
Print Graph BFS: 31704256
*/
//=========建立邻接矩阵=======
void CreatMGraph(MGraph *G)
{
int i,j,k;
char a;
printf("Input VertexNum(n) and EdgesNum(e): ");
scanf("%d,%d",&G->n,&G->e); //输入顶点数和边数
scanf("%c",&a);
printf("Input Vertex string:");
for(i=0;i<G->n;i++)
{
scanf("%c",&a);
G->vexs[i]=a; //读入顶点信息,建立顶点表
}
for(i=0;i<G->n;i++)
for(j=0;j<G->n;j++)
G->edges[i][j]=0; //初始化邻接矩阵
printf("Input edges,Creat Adjacency Matrix\n");
for(k=0;k<G->e;k++) { //读入e条边,建立邻接矩阵
scanf("%d%d",&i,&j); //输入边(Vi,Vj)的顶点序号
G->edges[i][j]=1;
G->edges[j][i]=1; //若为无向图,矩阵为对称矩阵;若建立有向图,去掉该条语句
}
}
//=========定义标志向量,为全局变量=======
typedef enum{FALSE,TRUE} Boolean;
Boolean visited[MaxVertexNum];
//========DFS:深度优先遍历的递归算法======
void DFSM(MGraph *G,int i)
{ //以Vi为出发点对邻接矩阵表示的图G进行DFS搜索,邻接矩阵是0,1矩阵
int j;
printf("%c",G->vexs[i]); //访问顶点Vi
visited[i]=TRUE; //置已访问标志
for(j=0;j<G->n;j++) //依次搜索Vi的邻接点
if(G->edges[i][j]==1 && ! visited[j])
DFSM(G,j); //(Vi,Vj)∈E,且Vj未访问过,故Vj为新出发点
}
void DFS(MGraph *G)
{
int i;
for(i=0;i<G->n;i++)
visited[i]=FALSE; //标志向量初始化
for(i=0;i<G->n;i++)
if(!visited[i]) //Vi未访问过
DFSM(G,i); //以Vi为源点开始DFS搜索
}
//===========BFS:广度优先遍历=======
void BFS(MGraph *G,int k)
{ //以Vk为源点对用邻接矩阵表示的图G进行广度优先搜索
int i,j,f=0,r=0;
int cq[MaxVertexNum]; //定义队列
for(i=0;i<G->n;i++)
visited[i]=FALSE; //标志向量初始化
for(i=0;i<G->n;i++)
cq[i]=-1; //队列初始化
printf("%c",G->vexs[k]); //访问源点Vk
visited[k]=TRUE;
cq[r]=k; //Vk已访问,将其入队。注意,实际上是将其序号入队
while(cq[f]!=-1) //队非空则执行
{
i=cq[f]; f=f+1; //Vf出队
for(j=0;j<G->n;j++) //依次Vi的邻接点Vj
if(G->edges[i][j]==1 && !visited[j]) //Vj未访问
{
printf("%c",G->vexs[j]); //访问Vj
visited[j]=TRUE;
r=r+1; cq[r]=j; //访问过Vj入队
}
}
}
//==========main=====
void main()
{

MGraph *G;
G=(MGraph *)malloc(sizeof(MGraph)); //为图G申请内存空间
CreatMGraph(G); //建立邻接矩阵
printf("Print Graph DFS: ");
DFS(G); //深度优先遍历
printf("\n");
printf("Print Graph BFS: ");
BFS(G,3); //以序号为3的顶点开始广度优先遍历

}


有的人追求幸福,所以努力。 有的人拥有幸福,所以放弃。
2006-05-17 21:36
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
得分:0 
我一直想不通广度和深度的好处在哪..

直接用for全部遍历不就可以嘛.而且还不会因为某结点没有全部连接而出现麻烦!

[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-05-17 21:40
unicorn
Rank: 4
等 级:贵宾
威 望:14
帖 子:1066
专家分:0
注 册:2005-10-25
得分:0 
...晕..偶的dfs 和bfs没有问题的 就是建立邻接表时出现问题了 邻接矩阵没有邻接表这么麻烦...

unicorn-h.spaces. ◇◆ sava-scratch.spaces.  noh enol ! pue pu!w hw u! shemle aq ll!m noh 
2006-05-18 20:07
C_ray
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2005-12-17
得分:0 
路过时,我也有过同样的疑问,不过现已解决。
恩,个人认为楼主在建图的过程中有一点小问题:
typedef struct VNode// 顶点结构体定义
{
VertexType data;//节点包含的数据
ArcNode *firstarc;//指向第一条弧的指针
}VNode,AdjList[max];

typedef struct //图的定义
{
AdjList vertices;
int vexnum,arcnum;
int kind;
}ALGraph;
其中AdjList[max]定义后,AdjList的性质不是足够的明显
还有一点,既然选择了用C++语言描述,为什么不用new、delete
取代malloc && free
可对比一下:
typedef struct vernode
{
int vertex;
ArcNode *firstNode;
}VerNode ;

typedef struct Graph
{
VerNode *vertices ;
int vexnum, arcnum;
}ALGraph;
......
G.vertices=new VerNode[MaxNode];

......

另外,用Class 总体上的结构效果会更好。
个人观点,如有不当,请指正,谢谢!


2006-05-28 16:28
liangke
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2006-12-11
得分:0 

果然有问题 有错误

2006-12-25 11:38



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-64758-1-1.html




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

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