标题:遍了一个图的深度和广度遍历似乎创建函数有点问题请高手帮忙帮我改一下
只看楼主
zxy910114
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2010-12-8
结帖率:0
已结贴  问题点数:20 回复次数:2 
遍了一个图的深度和广度遍历似乎创建函数有点问题请高手帮忙帮我改一下
#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;
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)
{
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("输入顶点数:");
scanf("%d",&G.vexnum);
printf("输入弧数:");
scanf("%d",&G.arcnum);
creat(G);
printf("deepfisrt:");
DFSTraverse(G);
printf("\nbroadfist:");
BFSTraverse(G);
}


搜索更多相关主题的帖子: 遍历 函数 深度 
2010-12-11 14:59
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
得分:20 
creat 函数很有问题

把其他不相关的全部注释掉

把 creat 写正确了 再进行下面的工作

这个是在做有向图 还是 无向图?
2010-12-11 16:35
zxy910114
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2010-12-8
得分:0 
回复 2楼 寒风中的细雨
#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;
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)
{
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;*/
G->Adjlist[i].firstarc=NULL;
}
for(i=0;i<G->arcnum;i++)
{
printf("弧:");
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;
}*/
q->nextarc=G->Adjlist[m].firstarc;
G->Adjlist[m].firstarc=q;
}
}

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==NULL) 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&&p->adjvex!=u) p=p->nextarc; /*在顶点v的弧链中找到顶点u*/
if(p==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])
     {visite[v]=1;
      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);
                 }
              }
     }
}
void main()
{int i;
printf("输入顶点数:");
scanf("%d",&G.vexnum);
printf("输入弧数:");
scanf("%d",&G.arcnum);
creat(&G);
for(i=1;i<=G.vexnum;i++)printf("%d,%d",G.Adjlist[i].data,G.Adjlist[i].firstarc->adjvex);
printf("ok");
for(i=1;i<=G.vexnum;i++) printf("%d",FirstAdjVex(G,i));
printf("%d",NextAdjVex(G,1,3));
getch();
printf("deepfisrt:");
DFSTraverse(G);
getch();
printf("\nbroadfist:");
BFSTraverse(G);
getch();
}
程序该成这样了为什么还是不行呢  这个是无向图
2010-12-13 20:36



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




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

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