三木社区

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

C语言数据结构-bo5-5.c

[复制链接]

1562

主题

1564

帖子

4904

积分

博士

Rank: 8Rank: 8

积分
4904
跳转到指定楼层
楼主
发表于 2017-9-1 08:51:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /* bo5-5.c 广义表的头尾链表存储(存储结构由c5-5.h定义)的基本操作(11个) */
  2. Status InitGList(GList *L)
  3. { /* 创建空的广义表L */
  4.    *L=NULL;
  5.    return OK;
  6. }

  7. void DestroyGList(GList *L) /* 广义表的头尾链表存储的销毁操作 */
  8. { /* 销毁广义表L */
  9.    GList q1,q2;
  10.    if(*L)
  11.    {
  12.      if((*L)->tag==ATOM)
  13.      {
  14.        free(*L); /* 删除原子结点 */
  15.        *L=NULL;
  16.      }
  17.      else /* 删除表结点 */
  18.      {
  19.        q1=(*L)->a.ptr.hp;
  20.        q2=(*L)->a.ptr.tp;
  21.        free(*L);
  22.        *L=NULL;
  23.        DestroyGList(&q1);
  24.        DestroyGList(&q2);
  25.      }
  26.    }
  27. }

  28. Status CopyGList(GList *T,GList L)
  29. { /* 采用头尾链表存储结构,由广义表L复制得到广义表T。算法5.6 */
  30.    if(!L) /* 复制空表 */
  31.      *T=NULL;
  32.    else
  33.    {
  34.      *T=(GList)malloc(sizeof(GLNode)); /* 建表结点 */
  35.      if(!*T)
  36.        exit(OVERFLOW);
  37.      (*T)->tag=L->tag;
  38.      if(L->tag==ATOM)
  39.        (*T)->a.atom=L->a.atom; /* 复制单原子 */
  40.      else
  41.      {
  42.        CopyGList(&((*T)->a.ptr.hp),L->a.ptr.hp);
  43.        /* 复制广义表L->ptr.hp的一个副本T->ptr.hp */
  44.        CopyGList(&((*T)->a.ptr.tp),L->a.ptr.tp);
  45.        /* 复制广义表L->ptr.tp的一个副本T->ptr.tp */
  46.      }
  47.    }
  48.    return OK;
  49. }

  50. int GListLength(GList L)
  51. { /* 返回广义表的长度,即元素个数 */
  52.    int len=0;
  53.    if(!L)
  54.      return 0;
  55.    if(L->tag==ATOM)
  56.      return 1;
  57.    while(L)
  58.    {
  59.      L=L->a.ptr.tp;
  60.      len++;
  61.    }
  62.    return len;
  63. }

  64. int GListDepth(GList L)
  65. { /* 采用头尾链表存储结构,求广义表L的深度。算法5.5 */
  66.    int max,dep;
  67.    GList pp;
  68.    if(!L)
  69.      return 1; /* 空表深度为1 */
  70.    if(L->tag==ATOM)
  71.      return 0; /* 原子深度为0 */
  72.    for(max=0,pp=L;pp;pp=pp->a.ptr.tp)
  73.    {
  74.      dep=GListDepth(pp->a.ptr.hp); /* 求以pp->a.ptr.hp为头指针的子表深度 */
  75.      if(dep>max)
  76.        max=dep;
  77.    }
  78.    return max+1; /* 非空表的深度是各元素的深度的最大值加1 */
  79. }

  80. Status GListEmpty(GList L)
  81. { /* 判定广义表是否为空 */
  82.    if(!L)
  83.      return TRUE;
  84.    else
  85.      return FALSE;
  86. }

  87. GList GetHead(GList L)
  88. { /* 取广义表L的头 */
  89.    GList h,p;
  90.    if(!L)
  91.    {
  92.      printf("空表无表头!\n");
  93.      exit(0);
  94.    }
  95.    p=L->a.ptr.tp;
  96.    L->a.ptr.tp=NULL;
  97.    CopyGList(&h,L);
  98.    L->a.ptr.tp=p;
  99.    return h;
  100. }

  101. GList GetTail(GList L)
  102. { /* 取广义表L的尾 */
  103.    GList t;
  104.    if(!L)
  105.    {
  106.      printf("空表无表尾!\n");
  107.      exit(0);
  108.    }
  109.    CopyGList(&t,L->a.ptr.tp);
  110.    return t;
  111. }

  112. Status InsertFirst_GL(GList *L,GList e)
  113. { /* 初始条件: 广义表存在 */
  114.    /* 操作结果: 插入元素e作为广义表L的第一元素(表头,也可能是子表) */
  115.    GList p=(GList)malloc(sizeof(GLNode));
  116.    if(!p)
  117.      exit(OVERFLOW);
  118.    p->tag=LIST;
  119.    p->a.ptr.hp=e;
  120.    p->a.ptr.tp=*L;
  121.    *L=p;
  122.    return OK;
  123. }

  124. Status DeleteFirst_GL(GList *L,GList *e)
  125. { /* 初始条件: 广义表L存在 */
  126.    /* 操作结果: 删除广义表L的第一元素,并用e返回其值 */
  127.    GList p;
  128.    *e=(*L)->a.ptr.hp;
  129.    p=*L;
  130.    *L=(*L)->a.ptr.tp;
  131.    free(p);
  132.    return OK;
  133. }

  134. void Traverse_GL(GList L,void(*v)(AtomType))
  135. { /* 利用递归算法遍历广义表L */
  136.    if(L) /* L不空 */
  137.      if(L->tag==ATOM) /* L为单原子 */
  138.        v(L->a.atom);
  139.      else /* L为广义表 */
  140.      {
  141.        Traverse_GL(L->a.ptr.hp,v);
  142.        Traverse_GL(L->a.ptr.tp,v);
  143.      }
  144. }
复制代码


回复

使用道具 举报

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

辽公网安备 21021702000620号

GMT+8, 2025-12-8 00:49 , Processed in 0.045299 second(s), 22 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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