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

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程式实例: 8_3_1.c                     */
  3. /*    图形的深度优先搜寻法                  */
  4. /* ======================================== */
  5. #include <stdlib.h>
  6. struct node                       /* 图形顶点结构宣告   */
  7. {
  8.    int vertex;                    /* 顶点资料           */
  9.    struct node *nextnode;         /* 指下一顶点的指标   */
  10. };
  11. typedef struct node *graph;       /* 图形的结构新型态   */
  12. struct node head[9];              /* 图形顶点结构数组   */
  13. int visited[9];                   /* 遍历记录数组       */
  14. /* ---------------------------------------- */
  15. /*  建立图形                                */
  16. /* ---------------------------------------- */
  17. void creategraph(int *node,int num)
  18. {
  19.    graph newnode;                 /* 新顶点指标         */
  20.    graph ptr;
  21.    int from;                      /* 边线的起点         */
  22.    int to;                        /* 边线的终点         */
  23.    int i;
  24.    for ( i = 0; i < num; i++ )    /* 读取边线的回路     */
  25.    {
  26.       from = node[i*2];           /* 边线的起点         */
  27.       to = node[i*2+1];           /* 边线的终点         */
  28.       /* 建立新顶点记忆体 */
  29.       newnode = ( graph ) malloc(sizeof(struct node));
  30.       newnode->vertex = to;       /* 建立顶点内容       */
  31.       newnode->nextnode = NULL;   /* 设定指标初值       */
  32.       ptr = &(head[from]);        /* 顶点位置           */
  33.       while ( ptr->nextnode != NULL ) /* 遍历至链表尾   */
  34.          ptr = ptr->nextnode;     /* 下一个顶点         */
  35.       ptr->nextnode = newnode;    /* 插入结尾           */
  36.    }
  37. }
  38. /* ---------------------------------------- */
  39. /*  图形的深度优先搜寻法                    */
  40. /* ---------------------------------------- */
  41. void dfs(int current)
  42. {
  43.    graph ptr;
  44.    visited[current] = 1;          /* 记录已遍历过       */
  45.    printf("顶点[%d] ",current);   /* 印出遍历顶点值     */
  46.    ptr = head[current].nextnode;  /* 顶点位置           */
  47.    while ( ptr != NULL )          /* 遍历至链表尾       */
  48.    {
  49.       if ( visited[ptr->vertex] == 0 )  /* 如过没遍历过 */
  50.          dfs(ptr->vertex);              /* 递回遍历呼叫 */
  51.       ptr = ptr->nextnode;              /* 下一个顶点   */
  52.    }
  53. }
  54. /* ---------------------------------------- */
  55. /*  主程式: 建立图形后,将遍历内容印出.      */
  56. /* ---------------------------------------- */
  57. void main()
  58. {
  59.    graph ptr;
  60.    int node[20][2] = { {1, 2}, {2, 1},  /* 边线数组     */
  61.                        {1, 3}, {3, 1},
  62.                        {2, 4}, {4, 2},
  63.                        {2, 5}, {5, 2},
  64.                        {3, 6}, {6, 3},
  65.                        {3, 7}, {7, 3},
  66.                        {4, 8}, {8, 4},
  67.                        {5, 8}, {8, 5},
  68.                        {6, 8}, {8, 6},
  69.                        {7, 8}, {8, 7} };
  70.    int i;
  71.    for ( i = 1; i <= 8; i++ )
  72.    {
  73.       head[i].vertex = i;         /* 设定顶点值         */
  74.       head[i].nextnode = NULL;    /* 清除图形指标       */
  75.       visited[i] = 0;             /* 设定遍历初值       */
  76.    }
  77.    creategraph(node,20);          /* 建立图形           */
  78.    printf("图形的邻接链表内容:n");
  79.    for ( i = 1; i <= 8; i++ )
  80.    {
  81.       printf("顶点%d =>",head[i].vertex); /* 顶点值     */
  82.       ptr = head[i].nextnode;             /* 顶点位置   */
  83.       while ( ptr != NULL )       /* 遍历至链表尾       */
  84.       {
  85.          printf(" %d ",ptr->vertex);  /* 印出顶点内容   */
  86.          ptr = ptr->nextnode;         /* 下一个顶点     */
  87.       }
  88.       printf("n");               /* 换行               */
  89.    }
  90.    printf("图形的深度优先遍历内容:n");
  91.    dfs(1);                        /* 印出遍历过程       */
  92.    printf("n");                  /* 换行               */
  93. }