回 帖 发 新 帖 刷新版面

主题:广度优先遍历有问题帮忙找一找?谢了

#include<stdio.h>
#include<stdlib.h>

#define LEN  sizeof(struct C)

struct C{
           int k;
           struct C*next;
         };

int *a;//存放定点数据
int *visit;//定点访问标记
int s=0;  
int**b;//存放邻接矩阵



//深度优先便历
void DFS(int i)

  int j;
  visit[i]=1;
  printf("%d->",a[i]);
  for(j=0;j<s;j++)
   if(b[i][j]==1&&!visit[j])
     DFS(j);

}//DFS

void depthfirst()
{
    int i;
    for(i=0;i<s;i++)
    if(!visit[i]) DFS(i);
    
}

//无向图的存储(邻接矩阵)

void creatgraphics(int n,int arcnum )
{
  int i=0,j=0,k=0;
  s=n;
  a=(int *)malloc(n*sizeof(int));



 b=(int**)malloc(sizeof(int*)*n);
 for (i=0;i<n;i++) 
 {
    b[i] = (int*)malloc(sizeof(int)*n);
 }


  visit=(int *)malloc(n*sizeof(int));
    

  for(i=0;i<n;i++)//构造顶点向量
  { 
    printf("请输入顶点信息\n");
    scanf("%d",&a[i]);
  }


for(i=0;i<n;i++)
    visit[i]=0;
  
for(i=0;i<n;i++)//初始化邻接矩阵
  for(j=0;j<n;j++)
     b[i][j]=0;

//构造邻接矩阵
   for(k=0;k<arcnum;k++)
   {
    printf("请输入有边邻接的两个顶点\n");
    scanf("%d %d",&i,&j);
        if( b[i-1][j-1]!=1)
        {
           b[i-1][j-1]=1;
           b[j-1][i-1]=b[i-1][j-1];
        }
   }
 
}//creatgraphics


//广度优先遍历
void breadfirst(int vexnum)//vexnum顶点数
{
    int i,j,x=0;
    //建队列
    struct C *duitou,*duiwei,*A; 
    A=duitou=duiwei=(struct C*)malloc(LEN);
    duitou->next=NULL; 
    duitou->k=a[0];
    for(i=0;i<s;i++)
       visit[i]=0;
    for(i=0;i<vexnum;i++)
    {
       if(!visit[i])
       {
          while(duitou!=NULL)
          { 
             //打印队头
              printf("%d->",duitou->k);
              for(i=0;i<s;i++)
                    if(a[i]==duitou->k) 
                    {
                        x=i;
                        visit[i]=1;
                    }
                      
               for(j=0;j<s;j++)
               {
                   if(b[x][j]=1&&!visit[j])
                   {
                       //a[j]入队
                    duiwei=(struct C*)malloc(LEN);
                    A->next=duiwei;
                    duiwei->k=a[j];
                    duiwei->next=NULL;
                    A=duiwei;
                   }
               }

               //出队
              duitou=duitou->next;
          }//while
        

       }//if

    }//for
  printf("\n");
}//breadfirst

main()
{
    int y,v,z;

loop1:
    printf("请选择遍历方式\n1:深度优先(按 1)\n2:广度优先(按 2)\n3:深度优先+广度优先()(按 3)\n");
    scanf("%d",&z);

    if(z==1)
    {
        printf("请输入图中顶点个数\n");
        scanf("%d",&y);

        printf("请输入图中边的条数\n");
        scanf("%d",&v);
         
        creatgraphics(y,v);
        printf("深度优先遍历结果:\n");
        depthfirst();

    }
    if(z==2)
    {
        printf("请输入图中顶点个数\n");
         scanf("%d",&y);

        printf("请输入图中边的条数\n");
        scanf("%d",&v);
       
        creatgraphics(y,v);
        printf("广度优先遍历结果:\n");
        breadfirst(y);
    }
   if(z==3)
    {
        printf("请输入图中顶点个数\n");
         scanf("%d",&y);

        printf("请输入图中边的条数\n");
        scanf("%d",&v);
       
        creatgraphics(y,v);
        printf("深度优先遍历结果:\n");
        depthfirst();
        printf("\n");
        printf("广度优先遍历结果:\n");
        breadfirst(y);
    }
   if(z!=1&&z!=2&&z!=3)
   {
       printf("wrong command!\n");
       goto loop1;
   }
}





        

    

回复列表 (共3个回复)

沙发

你上面的程序有缺陷,你的广度遍历的函数有一些小错误和一些没有考虑到的情况,我给你全改过来了

下面是正确的程序

下面程序中我用了一个数组来判断元素是否入过队

板凳



//广度优先遍历
void breadfirst(int vexnum)//vexnum顶点数
{
    int i,j,x=0,*temp;//这里定义一个temp数组判断元素有无入过队,若入过队,则赋值为1,否则为0
    //建队列
    struct C *duitou,*duiwei,*A;
    temp=(int *)malloc(s*sizeof(int)); 
    for(i=0;i<s;i++)temp[i]=0; //初始化temp数组
    A=duitou=(struct C*)malloc(LEN);
    duitou->next=NULL; 
    duitou->k=a[0];
    temp[0]=1;
    for(i=0;i<s;i++)
       visit[i]=0;
    for(i=0;i<vexnum;i++)
    {
       if(!visit[i])
       {
          while(duitou!=NULL)
          { 
             //打印队头
              printf("%d->",duitou->k);
              for(i=0;i<s;i++)
                    if(a[i]==duitou->k) 
                    {
                        x=i;
                        visit[i]=1;
                    }
                      
               for(j=0;j<s;j++)
               {
                   if(b[x][j]==1&&!visit[j]&&!temp[j]) //这里你用的是b[x][j]=1少了一个等号
                   {
                       //a[j]入队
                     //这里因为入队了的元素不一定都访问过了,所以有可能造成同一个元素重复入队
                     //其它地方没错
                    duiwei=(struct C*)malloc(LEN);
                    A->next=duiwei;
                    duiwei->k=a[j];
                    duiwei->next=NULL;
                    A=duiwei;
                    temp[j]=1;
                    //if
                   }
               }

               //出队
              duitou=duitou->next;
          }//while
        

       }//if

    }//for
  printf("\n");
}//breadfirst

3 楼

非常感谢你的帮助!谢了。还希望以后多多指教!

我来回复

您尚未登录,请登录后再回复。点此登录或注册