| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2233 人关注过本帖
标题:这个有向图广度优先遍历哪里错了 帮忙看看
只看楼主 加入收藏
不同认为
Rank: 1
等 级:新手上路
帖 子:93
专家分:3
注 册:2015-11-25
结帖率:57.14%
收藏
已结贴  问题点数:10 回复次数:8 
这个有向图广度优先遍历哪里错了 帮忙看看

#include <stdio.h>
#include <malloc.h>
#define MAX_VERTEX_NUM 100
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int VRType;   
typedef char VertexType;
typedef char InfoType;
typedef enum {DG,DN,UDG,UDN}GraphKind;
typedef char QElemType;
int visited[MAX_VERTEX_NUM];
typedef struct ArcCell
{
    VRType adj;
    InfoType *info;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct
{
    VertexType vexs[MAX_VERTEX_NUM];
    AdjMatrix arcs;
    int vexnum,arcnum;
    GraphKind kind;
}MGraph;
typedef struct QNode
{
    QElemType data;
    struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
    QueuePtr front;
    QueuePtr rear;
}LinkQueue;  
Status InitQueue(LinkQueue &Q)  
{
   Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
   if(!Q.front) return ERROR;
   Q.front->next=NULL;   
   return OK;
}
Status EnQueue(LinkQueue &Q,QElemType e)
{
    QueuePtr p;
    p=(QueuePtr)malloc(sizeof(QNode));
    if(!p) return ERROR;        
    p->data=e;   
      p->next=NULL;      
       Q.rear->next=p;
       Q.rear=p;
    return OK;
}
Status DeQueue(LinkQueue &Q,QElemType &e)
{
     QueuePtr p;
  if(Q.front==Q.rear)
        return ERROR;
  p=Q.front->next;
  Q.front->next=p->next;
  if(Q.rear==p)
      Q.rear=Q.front;
  free(p);
  return OK;
}
int LocateVex(MGraph G,VertexType v)
{
     int j=-1,k;
     for(k=0;k<G.vexnum;k++)
         if(G.vexs[k]==v)
        {
            j=k;
            break;
        }
     return j;
}
Status CreateUDN(MGraph &G)
{
    int i,j,k;
    VertexType v1,v2;
    scanf("%d%d",&G.vexnum,&G.arcnum);
    getchar();
    for(i=0;i<G.vexnum;i++)
        scanf("%c",&G.vexs[i]);
    for(i=0;i<G.vexnum;i++)
    for(j=0;j<G.vexnum;j++)
        G.arcs[i][j].adj=0;
      for (k=0;k<G.arcnum;k++)
      {   
          getchar();
        scanf("%c%c",&v1,&v2);  
        i=LocateVex(G,v1);j=LocateVex(G,v2);  
        G.arcs[i][j].adj=1;
      }
      return OK;
}
Status first(MGraph G,int v)
{
    int j;
    for(j=0;j<G.vexnum;j++)
        if(G.arcs[v][j].adj==1)
            return j;
        return -1;
}
Status next(MGraph G,int v,int w)
{
    int j;
    for(j=w+1;j<G.vexnum;j++)
        if(G.arcs[v][j].adj==1)
            return j;
        return -1;
}
void guangdu(MGraph G)
{
    int j,w,v;
    LinkQueue Q;
    for(v=0;v<G.vexnum;v++)
        visited[v]=0;
    InitQueue(Q);
    for(v=0;v<G.vexnum;v++)
        if(!visited[v])
        {
          visited[v]=TRUE;
          printf("%c",G.vexs[v]);
          EnQueue(Q,G.vexs[v]);
        while(Q.front!=Q.rear)
        {
           DeQueue(Q,G.vexs[v]);
           for(w=first(G,v);w!=-1;w=next(G,v,w))
               if(!visited[w])
              { visited[w]=true;
                printf("%c",G.vexs[w]);
                 EnQueue(Q,G.vexs[w]);
               }
        }
        }
}
int main()
{
  MGraph G;
  CreateUDN(G);
  guangdu(G);
  printf("n");
  return 0;
}
搜索更多相关主题的帖子: include 
2015-11-26 16:02
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
DeQueue(Q, G.vexs[v]);  // 这一行错了,出队列的值覆盖G.vexs[v]倒是也能接受,可是后面完全没有用到这个值,出队列的意义就没有了

程序代码:
入队
while (队非空)
beg:
    出队 --> tmp
    打印 tmp
    遍历tmp的子节点,依次入队
end


还是重写吧


[fly]存在即是合理[/fly]
2015-11-27 10:57
不同认为
Rank: 1
等 级:新手上路
帖 子:93
专家分:3
注 册:2015-11-25
收藏
得分:0 
回复 2楼 azzbcc
这样改还是错了
#include <stdio.h>
#include <malloc.h>
#define MAX_VERTEX_NUM 100
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int VRType;   
typedef char VertexType;
typedef char InfoType;
typedef enum {DG,DN,UDG,UDN}GraphKind;
typedef char QElemType;
int visited[MAX_VERTEX_NUM];
typedef struct ArcCell
{
    VRType adj;
    InfoType *info;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct
{
    VertexType vexs[MAX_VERTEX_NUM];
    AdjMatrix arcs;
    int vexnum,arcnum;
    GraphKind kind;
}MGraph;
typedef struct QNode
{
    QElemType data;
    struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
    QueuePtr front;
    QueuePtr rear;
}LinkQueue;  
int LocateVex(MGraph G,VertexType v)
{
     int j=-1,k;
     for(k=0;k<G.vexnum;k++)
         if(G.vexs[k]==v)
        {
            j=k;
            break;
        }
     return j;
}
Status CreateUDN(MGraph &G)
{
    int i,j,k;
    VertexType v1,v2;
    scanf("%d%d",&G.vexnum,&G.arcnum);
    getchar();
    for(i=0;i<G.vexnum;i++)
        scanf("%c",&G.vexs[i]);
    for(i=0;i<G.vexnum;i++)
    for(j=0;j<G.vexnum;j++)
        G.arcs[i][j].adj=0;
      for (k=0;k<G.arcnum;k++)
      {   
          getchar();
        scanf("%c%c",&v1,&v2);  
        i=LocateVex(G,v1);j=LocateVex(G,v2);  
        G.arcs[i][j].adj=1;
      }
      return OK;
}
Status first(MGraph G,int v)
{
    int j;
    for(j=0;j<G.vexnum;j++)
        if(G.arcs[v][j].adj==1)
            return j;
        return -1;
}
Status next(MGraph G,int v,int w)
{
    int j;
    for(j=w+1;j<G.vexnum;j++)
        if(G.arcs[v][j].adj==1)
            return j;
        return -1;
}
Status InitQueue(LinkQueue &Q)  
{
   Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
   if(!Q.front) return ERROR;
   Q.front->next=NULL;   
   return OK;
}
Status EnQueue(LinkQueue &Q,QElemType e)
{
    QueuePtr p;
    p=(QueuePtr)malloc(sizeof(QNode));
    if(!p) return ERROR;        
     p->data=e;   
      p->next=NULL;      
       Q.rear->next=p;
       Q.rear=p;
    return OK;
}
Status DeQueue(LinkQueue &Q,QElemType &e)
{
     QueuePtr 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;
}
void guangdu(MGraph G)
{
    int v,w;
    char u;
    LinkQueue Q;
    for(v=0;v<G.vexnum;v++)
        visited[v]=0;
    InitQueue(Q);
    for(v=0;v<G.vexnum;v++)
        if(!visited[v])
        {
          visited[v]=TRUE;
          printf("%c",G.vexs[v]);
          EnQueue(Q,G.vexs[v]);
        while(Q.front!=Q.rear)
        {
           DeQueue(Q,u);
           for(w=first(G,u);w!=-1;w=next(G,u,w))
               if(!visited[w])
              { visited[w]=true;
                printf("%c",G.vexs[w]);
                 EnQueue(Q,w);
               }
        }
        }
}
int main()
{
  MGraph G;
  CreateUDN(G);
  guangdu(G);
  printf("\n");
  return 0;
}
2015-11-27 14:28
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:10 
学会debug

和你上一贴的问题正好反过来了

first 和 next 按下标查找,但你队列中存储的是节点具体值


[fly]存在即是合理[/fly]
2015-11-30 09:31
不同认为
Rank: 1
等 级:新手上路
帖 子:93
专家分:3
注 册:2015-11-25
收藏
得分:0 
回复 4楼 azzbcc
调试好像没那么容易  上次百度说什么按f5 ,还有按f10是什么单不调试
2015-11-30 12:06
不同认为
Rank: 1
等 级:新手上路
帖 子:93
专家分:3
注 册:2015-11-25
收藏
得分:0 
回复 4楼 azzbcc
感觉这样错了 但还是不对
void guangdu(MGraph G)
{
    int v,w;
    char u;
    LinkQueue Q;
    for(v=0;v<G.vexnum;v++)
        visited[v]=0;
    InitQueue(Q);
    for(v=0;v<G.vexnum;v++)
        if(!visited[v])
        {
          visited[v]=TRUE;
          printf("%c",G.vexs[v]);
          EnQueue(Q,G.vexs[v]);
        while(Q.front!=Q.rear)
        {
           DeQueue(Q,u);
           for(w=first(G,u);w!=-1;w=next(G,u,w))
               if(!visited[w])
              { visited[w]=true;
                printf("%c",G.vexs[w]);
                 EnQueue(Q,G.vexs[w]);
               }
        }
        }
}
2015-11-30 12:17
不同认为
Rank: 1
等 级:新手上路
帖 子:93
专家分:3
注 册:2015-11-25
收藏
得分:0 
回复 4楼 azzbcc

#include <stdio.h>
#include <malloc.h>
#define MAX_VERTEX_NUM 100
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int VRType;   
typedef char VertexType;
typedef char InfoType;
typedef enum {DG,DN,UDG,UDN}GraphKind;
typedef char QElemType;
int visited[MAX_VERTEX_NUM];
typedef struct ArcCell
{
    VRType adj;
    InfoType *info;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct
{
    VertexType vexs[MAX_VERTEX_NUM];
    AdjMatrix arcs;
    int vexnum,arcnum;
    GraphKind kind;
}MGraph;
typedef struct QNode
{
    QElemType data;
    struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
    QueuePtr front;
    QueuePtr rear;
}LinkQueue;  
int LocateVex(MGraph G,VertexType v)
{
     int j=-1,k;
     for(k=0;k<G.vexnum;k++)
         if(G.vexs[k]==v)
        {
            j=k;
            break;
        }
     return j;
}
Status CreateUDN(MGraph &G)
{
    int i,j,k;
    VertexType v1,v2;
    scanf("%d%d",&G.vexnum,&G.arcnum);
    getchar();
    for(i=0;i<G.vexnum;i++)
        scanf("%c",&G.vexs[i]);
    for(i=0;i<G.vexnum;i++)
    for(j=0;j<G.vexnum;j++)
        G.arcs[i][j].adj=0;
      for (k=0;k<G.arcnum;k++)
      {   
          getchar();
        scanf("%c%c",&v1,&v2);  
        i=LocateVex(G,v1);j=LocateVex(G,v2);  
        G.arcs[i][j].adj=1;
      }
      return OK;
}
Status first(MGraph G,int v)
{
    int j;
    for(j=0;j<G.vexnum;j++)
        if(G.arcs[v][j].adj==1)
            return j;
        return -1;
}
Status next(MGraph G,int v,int w)
{
    int j;
    for(j=w+1;j<G.vexnum;j++)
        if(G.arcs[v][j].adj==1)
            return j;
        return -1;
}
Status InitQueue(LinkQueue &Q)  
{
   Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
   if(!Q.front) return ERROR;
   Q.front->next=NULL;   
   return OK;
}
Status EnQueue(LinkQueue &Q,QElemType e)
{
    QueuePtr p;
    p=(QueuePtr)malloc(sizeof(QNode));
    if(!p) return ERROR;        
     p->data=e;   
      p->next=NULL;      
       Q.rear->next=p;
       Q.rear=p;
    return OK;
}
Status DeQueue(LinkQueue &Q,QElemType &e)
{
     QueuePtr 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;
}
void guangdu(MGraph G)
{
    int v,w;
    char u;
    LinkQueue Q;
    for(v=0;v<G.vexnum;v++)
        visited[v]=0;
    InitQueue(Q);
    for(v=0;v<G.vexnum;v++)
        if(!visited[v])
        {
          visited[v]=TRUE;
          printf("%c",G.vexs[v]);
          EnQueue(Q,v);
        while(Q.front!=Q.rear)
        {
           DeQueue(Q,u);
           for(w=first(G,u);w!=-1;w=next(G,u,w))
               if(!visited[w])
              { visited[w]=true;
                printf("%c",G.vexs[w]);
                 EnQueue(Q,w);
               }
        }
        }
}
int main()
{
  MGraph G;
  CreateUDN(G);
  guangdu(G);
  printf("\n");
  return 0;
}我这样改对了 但是我不知道为什么我这里EnQueue(Q,v) 传的是下标过去 那入队入的是下标而不是字符 感觉应该要入字符才对
2015-11-30 21:50
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
既然队列中控制传入字符,可以将节点值传入,出队列时再用LocateVex得到下标,然后调用first或next


[fly]存在即是合理[/fly]
2015-12-01 09:01
不同认为
Rank: 1
等 级:新手上路
帖 子:93
专家分:3
注 册:2015-11-25
收藏
得分:0 
回复 8楼 azzbcc
还有  一个 DeQueue(Q,u) 我这里的U定义为char  要是定义为 int 就错了  但是入队列的V我定义为int就没错  这是为什么
2015-12-02 13:03
快速回复:这个有向图广度优先遍历哪里错了 帮忙看看
数据加载中...
 
   



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

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