三木社区

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 362|回复: 0
打印 上一主题 下一主题

C语言数据结构-algo7-1.c

[复制链接]

1562

主题

1564

帖子

4904

积分

博士

Rank: 8Rank: 8

积分
4904
跳转到指定楼层
楼主
发表于 2017-9-1 09:25:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /* algo7-1.c 调用算法7.7、7.8 */
  2. #include"c1.h"
  3. #define MAX_NAME 2 /* 顶点字符串的最大长度+1 */
  4. typedef char ElemType[MAX_NAME];
  5. typedef ElemType TElemType;
  6. #include"c6-5.h"
  7. typedef int InfoType;
  8. typedef char VertexType[MAX_NAME];
  9. #include"c7-2.h"
  10. #include"bo7-2.c"

  11. void DFSTree(ALGraph G,int v,CSTree *T)
  12. { /* 从第v个顶点出发深度优先遍历图G,建立以T为根的生成树。算法7.8 */
  13.    Boolean first=TRUE;
  14.    int w;
  15.    CSTree p,q;
  16.    VertexType v1,w1;
  17.    visited[v]=TRUE;
  18.    strcpy(v1,*GetVex(G,v));
  19.    for(w=FirstAdjVex(G,v1);w>=0;w=NextAdjVex(G,v1,strcpy(w1,*GetVex(G,w)))) /* w依次为v的邻接顶点 */
  20.      if(!visited[w]) /* w顶点不曾被访问 */
  21.      {
  22.        p=(CSTree)malloc(sizeof(CSNode)); /* 分配孩子结点 */
  23.        strcpy(p->data,*GetVex(G,w));
  24.        p->firstchild=NULL;
  25.        p->nextsibling=NULL;
  26.        if(first)
  27.        { /* w是v的第一个未被访问的邻接顶点 */
  28.          (*T)->firstchild=p;
  29.          first=FALSE; /* 是根的第一个孩子结点 */
  30.        }
  31.        else /* w是v的其它未被访问的邻接顶点 */
  32.          q->nextsibling=p; /* 是上一邻接顶点的兄弟姐妹结点 */
  33.        q=p;
  34.        DFSTree(G,w,&q); /* 从第w个顶点出发深度优先遍历图G,建立子生成树q */
  35.      }
  36. }

  37. void DFSForest(ALGraph G,CSTree *T)
  38. { /* 建立无向图G的深度优先生成森林的(最左)孩子(右)兄弟链表T。算法7.7 */
  39.    CSTree p,q;
  40.    int v;
  41.    *T=NULL;
  42.    for(v=0;v<G.vexnum;++v)
  43.      visited[v]=FALSE; /* 赋初值 */
  44.    for(v=0;v<G.vexnum;++v) /* 从第0个顶点找起 */
  45.      if(!visited[v])
  46.      { /* 第v顶点为新的生成树的根结点 */
  47.        p=(CSTree)malloc(sizeof(CSNode)); /* 分配根结点 */
  48.        strcpy(p->data,*GetVex(G,v));
  49.        p->firstchild=NULL;
  50.        p->nextsibling=NULL;
  51.        if(!*T) /* 是第一棵生成树的根(T的根) */
  52.          *T=p;
  53.        else /* 是其它生成树的根(前一棵的根的"兄弟") */
  54.          q->nextsibling=p;
  55.        q=p; /* q指示当前生成树的根 */
  56.        DFSTree(G,v,&p); /* 建立以p为根的生成树 */
  57.      }
  58. }

  59. void PreOrderTraverse(CSTree T,void(*Visit)(TElemType))
  60. { /* 先根遍历孩子-兄弟二叉链表结构的树T(bo6-5.c改) */
  61.    if(T)
  62.    {
  63.      Visit(T->data); /* 先访问根结点 */
  64.      PreOrderTraverse(T->firstchild,Visit); /* 再先根遍历长子子树 */
  65.      PreOrderTraverse(T->nextsibling,Visit); /* 最后先根遍历下一个兄弟子树 */
  66.    }
  67. }

  68. void print(char *i)
  69. {
  70.    printf("%s ",i);
  71. }

  72. void main()
  73. {
  74.    ALGraph g;
  75.    CSTree t;
  76.    printf("请选择无向图\n");
  77.    CreateGraph(&g);
  78.    Display(g);
  79.    DFSForest(g,&t);
  80.    printf("先根遍历生成森林:\n");
  81.    PreOrderTraverse(t,print);
  82.    printf("\n");
  83. }
复制代码


回复

使用道具 举报

Archiver|手机版|小黑屋|三木电子社区 ( 辽ICP备11000133号-4 )

辽公网安备 21021702000620号

GMT+8, 2025-5-12 01:25 , Processed in 0.025523 second(s), 22 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表