BWM Studio

The Blow Water Machines...

spritsqID:spritsq
13761次访问,排名8196好友0人,关注者0
spritsq的文章
原创 40 篇
翻译 0 篇
转载 0 篇
评论 24 篇
BWM Studio的公告
BWM Studio 新版Logo

大家抓紧时间报星火杯啊,其实没什么难度的,去年我们随便报了两个,都得奖了
最近评论
schindlor@163.com:从那里能得到?
sprit-only:大家多多支持啊!
文章分类
收藏
    相册
    常用Blogs
    biggates难得更新的个人主页(RSS)
    chencheng(RSS)
    人月神话(RSS)
    剑灵的世界
    推荐编程网站
    CSDN
    PKU JudgeOnline
    代码中国(RSS)
    编程爱好者
    我们的作品
    西安电子科技大学社团联合会
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 第十章第十六题 POWERBY KTL收藏

    新一篇: Prim算法生成最小树 Powerby KTL | 旧一篇: 第10章第16题定义(h) (Powered by biggates)

    //16.利用图的深度优先搜索和广度优先搜索各写一个算法,
    //辨别以邻接表方式表示的有向图中是否存在由顶点Vi到顶点Vj的路径(i!=j).
    //深度优先(第一个函数Route)
    //广度优先(第二个函数Route,需要去调注释同时把深度优先函数注释掉;
    //程序输入,参考书本P225页图10-6
    //输入顶点信息为1234(回车);
    //输入边数为4;
    //输入第一边:1 2
    //输入第二边:1 3
    //输入第三边:3 4
    //输入第四边:4 1
    //按#结束测试程序;
    #include "stdio.h"
    #include "stdlib.h"
    #include "conio.h"

    #define n 4
    typedef char vextype;
    typedef struct node1   //由于与队列结点定义发生冲突,因此改为node1;
    {
     int adjvex;
     struct node1 *pNext;
    }edgenode;
    typedef struct
    {
     vextype vertex;
     edgenode *link;
    }vexnode;

    vexnode ga[n];
    int visited[n]={0};

    void CreatList(vexnode ga[])
    {
     int i,j,k,e,h;
     edgenode *s;
     printf("请输入顶点信息:");
     for(i=0;i<n;i++)
     {
      ga[i].vertex=getchar();
      ga[i].link=NULL;
     }
     printf("请输入有向边的数目:");
     scanf("%d",&e);
     h=1;
     for(k=0;k<e;k++)
     {
      printf("请输入第%d个边的i,j:",h++);
      scanf("%d %d",&i,&j);
      s=(edgenode*)malloc(sizeof(edgenode));
      s->adjvex=j;
      s->pNext=ga[i].link;
      ga[i].link=s;
     }
     return;
    }

    int flag=0;//标志为全局变量

    //以下函数为按深度优先判断是否存在路径(注意下面的注释)
    ///*
    void Route(int i,int j)
    {
     edgenode *p;
     if(i==j)
     {
      flag=1;
      return;
     }
     visited[i]=1;
     p=ga[i].link;
     while(p!=NULL)
     {
      if(visited[p->adjvex]==0)
       Route(p->adjvex,j);
      p=p->pNext;
     }
     return;
    }
    //*/
    //以下函数为按广度优先判断是否存在路径;
    //附队列程序  把注释去掉即可调用广度优先判断是否存在路径;
    /*

    typedef char datatype;

    typedef struct node2
    {
     datatype data;
     struct node2 * pNext;
    }linklist;

    typedef struct
    {
     linklist *front,*rear;
    }linkqueue;

    void SETNULLQL(linkqueue *q)
    {
     q->front=(linklist*)malloc(sizeof(linklist));
     q->front->pNext=NULL;
     q->rear=q->front;
    }//置空队

    bool EMPTYQL(linkqueue*q)
    {
     if(q->front==q->rear)
      return true;
     else return false;
    }//判断队空

    datatype FRONTQL(linkqueue*q)
    {
     if(EMPTYQL(q))
     {
      printf("队空");
      return -1;
     }
     else return(q->front->pNext->data);
    }//取队头元素

    void ENQUEUEQL(linkqueue *q,datatype x)
    {
     q->rear->pNext=(linklist *)malloc(sizeof(linklist));
     q->rear=q->rear->pNext;
     q->rear->data=x;
     q->rear->pNext=NULL;
    }//入队

    datatype DEQUEUEQL(linkqueue*q)
    {
     datatype temp;
     linklist * s;
     if(EMPTYQL(q))
     {
      printf("队空");
      return -1;
     }
     else{
      s=q->front->pNext;
      if(s->pNext==NULL)
      {
       q->front->pNext=NULL;
       q->rear=q->front;
      }
      else q->front->pNext=s->pNext;
      temp=s->data;
      free(s);
      return(temp);
     }
    }//删除队头元素并返回队头元素

    void Route(int i,int j)
    {
     int k;
     edgenode *p;
     linkqueue *Q;
     Q=(linkqueue*)malloc(sizeof(linkqueue));
     SETNULLQL(Q);
     if(i==j){
      flag=1;
      return;
     }
     visited[i]=1;
     ENQUEUEQL(Q,i);
     while(!EMPTYQL(Q))
     {
      k=DEQUEUEQL(Q);
      p=ga[k].link;
      while(p!=NULL)
      {
       if(visited[p->adjvex]!=1)
       {
        if(p->adjvex==j){    //与深度优先不同,关键这里要用的是p->adjvex==j;
         flag=1;
         return;
        }
        visited[p->adjvex]=1;
        ENQUEUEQL(Q,p->adjvex);
       }
       p=p->pNext;
      }
     }
    }

    */
    int main()
    {
     char ch;
     int i,j,k;
     printf("本程序为测试i到j是否有路径...\n");
     CreatList(ga);
     while(ch!='#')
     {
      printf("请输入要测试的顶点Vi与Vj的下标:");
      scanf("%d %d",&i,&j);
      Route(i,j);
      if(flag)
       printf("存在路径...\n");
      else
       printf("不存在路径...\n");
      printf("如果退出请输入#...按任意键继续...\n");
      ch=getch();
      flag=0;
      for(k=0;k<n;k++)
       visited[k]=0;
     }
     return 0;
    }

    发表于 @ 2006年06月09日 01:32:00|评论(loading...)|编辑

    新一篇: Prim算法生成最小树 Powerby KTL | 旧一篇: 第10章第16题定义(h) (Powered by biggates)

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © BWM Studio