8_3_2.C
上传用户:wyn840322
上传日期:2007-01-13
资源大小:294k
文件大小:5k
源码类别:

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程式实例: 8_3_2.c                     */
  3. /*    图形的广度优先搜寻法                  */
  4. /* ======================================== */
  5. #include <stdlib.h>
  6. #define MAXQUEUE 10               /* 伫列的最大容量       */
  7. struct node                       /* 图形顶点结构宣告     */
  8. {
  9.    int vertex;                    /* 顶点资料             */
  10.    struct node *nextnode;         /* 指下一顶点的指标     */
  11. };
  12. typedef struct node *graph;       /* 图形的结构新型态     */
  13. struct node head[9];              /* 图形顶点结构数组     */
  14. int visited[9];                   /* 遍历记录数组         */
  15. int queue[MAXQUEUE];              /* 伫列的数组宣告       */
  16. int front = -1;                   /* 伫列的前端           */
  17. int rear = -1;                    /* 伫列的后端           */
  18. /* ---------------------------------------- */
  19. /*  建立图形                                */
  20. /* ---------------------------------------- */
  21. void creategraph(int *node,int num)
  22. {
  23.    graph newnode;                 /* 新顶点指标           */
  24.    graph ptr;
  25.    int from;                      /* 边线的起点           */
  26.    int to;                        /* 边线的终点           */
  27.    int i;
  28.    for ( i = 0; i < num; i++ )    /* 读取边线的回路       */
  29.    {
  30.       from = node[i*2];           /* 边线的起点           */
  31.       to = node[i*2+1];           /* 边线的终点           */
  32.       /* 建立新顶点记忆体 */
  33.       newnode = ( graph ) malloc(sizeof(struct node));
  34.       newnode->vertex = to;       /* 建立顶点内容         */
  35.       newnode->nextnode = NULL;   /* 设定指标初值         */
  36.       ptr = &(head[from]);        /* 顶点位置             */
  37.       while ( ptr->nextnode != NULL ) /* 遍历至链表尾     */
  38.          ptr = ptr->nextnode;         /* 下一个顶点       */
  39.       ptr->nextnode = newnode;        /* 插入结尾         */
  40.    }
  41. }
  42. /* ---------------------------------------- */
  43. /*  伫列资料的存入                          */
  44. /* ---------------------------------------- */
  45. int enqueue(int value)
  46. {
  47.    if ( rear >= MAXQUEUE )        /* 检查伫列是否全满     */
  48.       return -1;                  /* 无法存入             */
  49.    rear++;                        /* 后端指标往前移       */
  50.    queue[rear] = value;           /* 存入伫列             */
  51. }
  52. /* ---------------------------------------- */
  53. /*  伫列资料的取出                          */
  54. /* ---------------------------------------- */
  55. int dequeue()
  56. {
  57.    if ( front  == rear )          /* 检查伫列是否是空     */
  58.       return -1;                  /* 无法取出             */
  59.    front++;                       /* 前端指标往前移       */
  60.    return queue[front];           /* 伫列取出             */
  61. }
  62. /* ---------------------------------------- */
  63. /*  图形的广度优先搜寻法                    */
  64. /* ---------------------------------------- */
  65. void bfs(int current)
  66. {
  67.    graph ptr;
  68.    /* 处理第一个顶点 */
  69.    enqueue(current);              /* 将顶点存入伫列       */
  70.    visited[current] = 1;          /* 记录已遍历过         */
  71.    printf("顶点[%d] ",current);   /* 印出遍历顶点值       */
  72.    while ( front != rear )        /* 伫列是否是空的       */
  73.    {
  74.       current = dequeue();        /* 将顶点从伫列取出     */
  75.       ptr = head[current].nextnode;   /* 顶点位置         */
  76.       while ( ptr != NULL )           /* 遍历至链表尾     */
  77.       {
  78.          if ( visited[ptr->vertex] == 0 ) /* 如过没遍历过 */
  79.          {
  80.             enqueue(ptr->vertex);     /* 递回遍历呼叫     */
  81.             visited[ptr->vertex] = 1; /* 记录已遍历过     */
  82.             /* 印出遍历顶点值 */
  83.             printf("顶点[%d] ",ptr->vertex);
  84.          }
  85.          ptr = ptr->nextnode;     /* 下一个顶点           */
  86.       }
  87.    }
  88. }
  89. /* ---------------------------------------- */
  90. /*  主程式: 建立图形后,将遍历内容印出.      */
  91. /* ---------------------------------------- */
  92. void main()
  93. {
  94.    graph ptr;
  95.    int node[20][2] = { {1, 2}, {2, 1},  /* 边线数组       */
  96.                        {1, 3}, {3, 1},
  97.                        {2, 4}, {4, 2},
  98.                        {2, 5}, {5, 2},
  99.                        {3, 6}, {6, 3},
  100.                        {3, 7}, {7, 3},
  101.                        {4, 8}, {8, 4},
  102.                        {5, 8}, {8, 5},
  103.                        {6, 8}, {8, 6},
  104.                        {7, 8}, {8, 7} };
  105.    int i;
  106.    for ( i = 1; i <= 8; i++ )
  107.    {
  108.       head[i].vertex = i;         /* 设定顶点值           */
  109.       head[i].nextnode = NULL;    /* 清除图形指标         */
  110.       visited[i] = 0;             /* 设定遍历初值         */
  111.    }
  112.    creategraph(node,20);          /* 建立图形             */
  113.    printf("图形的邻接链表内容:n");
  114.    for ( i = 1; i <= 8; i++ )
  115.    {
  116.       printf("顶点%d =>",head[i].vertex); /* 顶点值       */
  117.       ptr = head[i].nextnode;             /* 顶点位置     */
  118.       while ( ptr != NULL )       /* 遍历至链表尾         */
  119.       {
  120.          printf(" %d ",ptr->vertex);  /* 印出顶点内容     */
  121.          ptr = ptr->nextnode;         /* 下一个顶点       */
  122.       }
  123.       printf("n");               /* 换行                 */
  124.    }
  125.    printf("图形的广度优先遍历内容:n");
  126.    bfs(1);                        /* 印出遍历过程         */
  127.    printf("n");                  /* 换行                 */
  128. }