| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1587 人关注过本帖
标题:[求助]无向图的深度和广度优先遍历,
只看楼主 加入收藏
angelwlr
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2006-11-14
收藏
 问题点数:0 回复次数:7 
[求助]无向图的深度和广度优先遍历,

//一个无向图关糸邻接表的遍历,有几个错误,大家帮帮忙.拜托了,


#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define OVERFLOW -2
#define ERROR -1
#define NULL 0
#define OK 1
#define MAX_VEX_NUM 20
#define MAXQSIZE 20

typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode{
int data;
ArcNode *firstarc;
}VNode ;
typedef struct{
VNode Adjlist[1+MAX_VEX_NUM];
int vexnum,arcnum;
}ALGraph;
typedef struct Qnode
{
int data;
struct Qnode *next;
}Qnode,*QueuePtr;
typedef struct linkqueue
{
QueuePtr front;
QueuePtr rear;
}linkqueue;

linkqueue Q;
ALGraph G;
ArcNode *p[1+MAX_VEX_NUM];//建邻接表所用的每个顶点的指针
int visite[1+MAX_VEX_NUM];//顶点是否被访问过的的标志

void creat();
void DFSTraverse();
void DFS(ALGraph G,int v);
void cread(ALGraph &G);
int FirstAdjVex(ALGraph G,int v);
int NextAdjVex(ALGraph G,int v,int u);
void BFSTraverse();
int EnQueue(linkqueue &Q,int e);


int InitQueue(linkqueue Q)
{
Q.front =Q.rear =(QueuePtr)malloc(sizeof(Qnode));
if(!Q.front )exit(0);
Q.front ->next = NULL;
return OK;

}

int EnQueue(linkqueue &Q,int e)
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(Qnode));
if(!p)exit(OVERFLOW);
P->data = e; // F:\c\data struct\53l.cpp(63) : error C2065: 'P' : undeclared identifier
Q.rear ->next=p; //明明 声明了为什么说没声明呢?????
Q.rear =p;
return OK;

}

int DeQueue(linkqueue &Q,int &e)
{
Qnode *p;
if(Q.front==Q.rear)return ERROR;
p= Q.front ->next ;
e=p->data ;

Q.front->next =p->next ;
if(Q.rear ==p)Q.rear =Q.front ;
free(p);
return OK ;
}
int QueueEmpty(linkqueue Q);
{ //F:\c\data struct\53l.cpp(84) : error C2447: missing function header (old-style formal list?)
//这是什么错误啊,,
if(Q.front==Q.rear)return OK;
else return 0;
}

void creat(ALGraph &G)
{

int i;
int m,n;
ArcNode *q;
for(i=1;i<=G.vexnum;i++)
{
G.Adjlist[i].data=i;//初始化顶点名。用数字从1开始。
G.Adjlist[i].firstarc->adjvex=0;
p[i]=G.Adjlist[i].firstarc;
}
for(i=0;i<G.arcnum;i++)
{
printf("the arc:");
scanf("%d",&m); scanf("%d",&n);
q=(ArcNode *)malloc(sizeof(ArcNode));
q->adjvex=n;
if(!G.Adjlist[m].firstarc)
{
G.Adjlist[m].firstarc->adjvex=q->adjvex;
p[m]=q->nextarc;
}
else
{
p[m]->adjvex=q->adjvex;
p[m]=q->nextarc;
}

}

}

void DFSTraverse(ALGraph G)
{
int v;
for(v=1;v<=G.vexnum;++v)visite[v]=0;
for(v=1;v<=G.vexnum;++v)
{
if(!visite[v])DFS(G,v);
}
}
void DFS(ALGraph G,int v)
{
int w;
visite[v]=1;printf("%d,",v);
for(w=FirstAdjVex(G,v);w>0;w=NextAdjVex(G,v,w))
if(!visite[v])DFS(G,w);
}
int FirstAdjVex(ALGraph G,int v)//在图G中寻找第v个顶点的第一个邻接顶点
{
if(!G.Adjlist[v].firstarc->adjvex) return 0;
else return(G.Adjlist[v].firstarc->adjvex);
}

int NextAdjVex(ALGraph G,int v,int u)//在图G中寻找第v个顶点的相对于u的下一个邻接顶点
{
ArcNode *p;
p=G.Adjlist[v].firstarc;
while(p->adjvex!=u) p=p->nextarc; //在顶点v的弧链中找到顶点u
if(p->nextarc==NULL) return 0; //若已是最后一个顶点,返回0
else return(p->nextarc->adjvex); //返回下一个邻接顶点的序号
}
void BFSTraverse(ALGraph G)
{
int v,w,u;
for(v=1;v<G.vexnum;++v)visite[v]=0;
InitQueue(Q);
for(v=1;v<G.vexnum;++v)
if(!visite[v])
{
printf("%d,",v);
EnQueue(Q,v);
while(!QueueEmpty(Q))
{
DeQueue(Q,u);
for(w=FirstAdjVex(G,u);w>0;w=NextAdjVex(G,u,w))
if(visite[w])
{
visite[w]=1;printf("%d,",w);
EnQueue(Q,w);

}//if
}//while
}//if
}


void main()
{
printf("input the vexnum of the graph:");
scanf("%d",&G.vexnum);
printf("input the arcnum of the graph:");
scanf("%d",&G.arcnum);
creat(G);
printf("deepfisrt:");
DFSTraverse(G);
printf("\nbroadfist:");
BFSTraverse(G);

}






搜索更多相关主题的帖子: 遍历 define 深度 ArcNode struct 
2006-12-20 23:08
fengwei
Rank: 1
等 级:新手上路
帖 子:57
专家分:0
注 册:2006-12-19
收藏
得分:0 
数据定义问题很多
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode{
int data;
ArcNode *firstarc;
}VNode ;
typedef struct{
VNode Adjlist[1+MAX_VEX_NUM];
int vexnum,arcnum;
}ALGraph;
typedef struct Qnode
{
int data;
struct Qnode *next;
}Qnode,*QueuePtr;
typedef struct linkqueue
{
QueuePtr front;
QueuePtr rear;
}linkqueue;

基本都错误

typedef struct 数据类型名
{
QueuePtr front;
QueuePtr rear;
}数据变量(可以先不定义);

以后定义 变量用

typedef struct 数据类型名 变量名;

2006-12-20 23:26
angelwlr
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2006-11-14
收藏
得分:0 
可是书上都是这样定义的啊,编译也没报错,
2006-12-20 23:47
fengwei
Rank: 1
等 级:新手上路
帖 子:57
专家分:0
注 册:2006-12-19
收藏
得分:0 
typedef struct{
VNode Adjlist[1+MAX_VEX_NUM];
int vexnum,arcnum;
}ALGraph;

这个也对吗???
2006-12-21 08:20
angelwlr
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2006-11-14
收藏
得分:0 
书上真的有这样 定义的啊.数据结构,严蔚敏版第163页.

为什么我的问题都没人回答啊,郁闷啊,
2006-12-21 22:55
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
// F:\c\data struct\53l.cpp(63) : error C2065: 'P' : undeclared identifier
你写成大写了.

int QueueEmpty(linkqueue Q);//分号
{ //F:\c\data struct\53l.cpp(84) : error C2447: missing function header (old-style formal list?)
//这是什么错误啊,,
if(Q.front==Q.rear)return OK;
else return 0;
}

倚天照海花无数,流水高山心自知。
2006-12-22 11:32
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
1.C语言中不同于其他语言区分大小写
2.void main() 改为 int main()
3.int QueueEmpty(linkqueue Q); 去掉';'
4.P->data = e; 改为 p->data = e;

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2006-12-22 20:52
angelwlr
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2006-11-14
收藏
得分:0 
是这样啊,那我改下看看,先谢谢大家了
2006-12-22 21:59
快速回复:[求助]无向图的深度和广度优先遍历,
数据加载中...
 
   



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

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