首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

广度遍历为何出不来

2012-12-16 
广度遍历为什么出不来啊# includestdio.h# include malloc.h# define null 0#define MAXVEX 100# defi

广度遍历为什么出不来啊
# include<stdio.h>
# include <malloc.h>
# define null 0
#define MAXVEX 100
# define max 100
typedef int Vertex;
struct arcnode
{ int adjvex;
struct arcnode *nextarc;};

struct node{
  int data;
  struct arcnode *firstarc;};

  typedef struct node algraph[MAXVEX+1];
  int visited [MAXVEX+1]={0};

  void creat (algraph g,int e,int n)
  {
  struct arcnode *p;
  int i,j,k;
  printf("请输入顶点信息");
  for (i=1;i<=n;i++)
  {
  scanf ("%d",&g[i].data);
  g[i].firstarc=null;
  }

  for (k=1;k<=e;k++)
  {
  printf("请输入边的两个顶点");
  scanf ("%d%d",&i,&j);
  p=(struct arcnode *)malloc(sizeof(struct arcnode));
  p->adjvex=j;
  p->nextarc=g[i].firstarc;
  g[i].firstarc=p;
p=( struct arcnode *)malloc(sizeof(struct arcnode));
p->adjvex=i;
  p->nextarc=g[j].firstarc;
  g[j].firstarc=p;

  }
  }

  void oupe (algraph g,int n)
  {
  int i;
  struct arcnode *p;
  for (i=1;i<=n;i++)
  {
  p=g[i].firstarc;
  printf("%d->",g[i].data);
  while (p!=null)
  {
  printf("%2d",p->adjvex);
  p=p->nextarc;
  }

  printf("\n");
  }
  }


  void dfs(algraph g,int i)
  {
  struct arcnode *p;
  printf("%3d",g[i].data);
  visited[i]=1;
  p=g[i].firstarc;
  while (p!=null)
  {
  if (visited[p->adjvex]==0)
  dfs(g,p->adjvex);
  p=p->nextarc;
  }
  }

  void bfs(algraph g,int vi)
{
  int i,v,n;
  int Q[max],front=0,rear=0;//循环队列 
  struct arcnode *p;
  for(i=0;i<n;i++)
  visited[i]=0; //队列赋初值 
  visited[vi]=1; //访问初始顶点 
  printf("%d",g[p->adjvex].data);
  rear=(rear+1)% max;
  Q[rear]=vi;//初始顶点入队列 
  while(front!=rear) //队列不为空的时候循环 
  {
  front=(front+1)%max;
  v=Q[front]; //出队列 
  p=g[i].firstarc;//查找v的第一个邻接点 
  while(p!=NULL)//查找v的所有邻接点 
  {
  if(visited[p->adjvex]==0)//未访问过则访问之 
  {
  visited[p->adjvex]=1;
  printf("%d--",g[p->adjvex].data);//访问该点并入队 
  rear=(rear+1)%max;
  Q[rear]=p->adjvex;
  }
  p=p->nextarc; //查找v的下一邻接点 
  }
  }
}















int main()
{
  algraph g;
  int e,n,i;
  printf("请输入顶点个数和边的个数");
  scanf("%d%d",&n,&e);
  creat(g,e,n);
  oupe(g,n);
  printf("输入从第几个顶点开始深度优先遍:");
  scanf("%d",&i);


  dfs(g,i);
printf("\n广度遍历为:");
  bfs(g,0);
}

热点排行