第九周项目4-广义表算法库及应用(1)

来源:互联网 发布:用友软件难吗 编辑:程序博客网 时间:2024/05/29 18:45
/*  
 * Copyright (c) 2016, 烟台大学计算机与控制工程学院  
 * All rights reserved。  
 * 文件名称 :1.cpp  
 * 作    者 :杨俊杰
 * 完成日期 :2016年 11月3日  
 * 版 本 号 :v1.0  
 * 问题描述 :建立广义表算法库
 * 输入描述 :
 * 输出描述 :

 */  

[cpp] view plain copy
  1. //1.头文glist.h,定义数据类型,声明函数;   
  2. typedef char ElemType;    
  3. typedef struct lnode    
  4. {    
  5.     int tag;                    //节点类型标识    
  6.     union    
  7.     {    
  8.         ElemType data;          //原子值    
  9.         struct lnode *sublist;  //指向子表的指针    
  10.     } val;    
  11.     struct lnode *link;         //指向下一个元素    
  12. } GLNode;                       //广义表节点类型定义    
  13.     
  14. int GLLength(GLNode *g);        //求广义表g的长度    
  15. int GLDepth(GLNode *g);     //求广义表g的深度    
  16. GLNode *CreateGL(char *&s);     //返回由括号表示法表示s的广义表链式存储结构    
  17. void DispGL(GLNode *g);                 //输出广义表g    
[cpp] view plain copy
  1. //2.源文件glist.cpp,实现广义表的基本运算,主要算法包括:  
  2. #include <stdio.h>    
  3. #include <malloc.h>    
  4. #include "glist.h"    
  5. int GLLength(GLNode *g)     //求广义表g的长度    
  6. {    
  7.     int n=0;    
  8.     GLNode *g1;    
  9.     g1=g->val.sublist;      //g指向广义表的第一个元素    
  10.     while (g1!=NULL)    
  11.     {    
  12.         n++;                //累加元素个数    
  13.         g1=g1->link;    
  14.     }    
  15.     return n;    
  16. }    
  17.     
  18. int GLDepth(GLNode *g)      //求广义表g的深度    
  19. {    
  20.     GLNode *g1;    
  21.     int max=0,dep;    
  22.     if (g->tag==0)          //为原子时返回0    
  23.         return 0;    
  24.     g1=g->val.sublist;      //g1指向第一个元素    
  25.     if (g1==NULL)           //为空表时返回1    
  26.         return 1;    
  27.     while (g1!=NULL)        //遍历表中的每一个元素    
  28.     {    
  29.         if (g1->tag==1)     //元素为子表的情况    
  30.         {    
  31.             dep=GLDepth(g1);    //递归调用求出子表的深度    
  32.             if (dep>max)    //max为同一层所求过的子表中深度的最大值    
  33.                 max=dep;    
  34.         }    
  35.         g1=g1->link;            //使g1指向下一个元素    
  36.     }    
  37.     return(max+1);          //返回表的深度    
  38. }    
  39.     
  40. GLNode *CreateGL(char *&s)      //返回由括号表示法表示s的广义表链式存储结构    
  41. {    
  42.     GLNode *g;    
  43.     char ch=*s++;                       //取一个字符    
  44.     if (ch!='\0')                      //串未结束判断    
  45.     {    
  46.         g=(GLNode *)malloc(sizeof(GLNode));//创建一个新节点    
  47.         if (ch=='(')                    //当前字符为左括号时    
  48.         {    
  49.             g->tag=1;                   //新节点作为表头节点    
  50.             g->val.sublist=CreateGL(s); //递归构造子表并链到表头节点    
  51.         }    
  52.         else if (ch==')')    
  53.             g=NULL;                     //遇到')'字符,g置为空    
  54.         else if (ch=='#')               //遇到'#'字符,表示为空表    
  55.             g=NULL;    
  56.         else                            //为原子字符    
  57.         {    
  58.             g->tag=0;                   //新节点作为原子节点    
  59.             g->val.data=ch;    
  60.         }    
  61.     }    
  62.     else                                 //串结束,g置为空    
  63.         g=NULL;    
  64.     ch=*s++;                            //取下一个字符    
  65.     if (g!=NULL)                        //串未结束,继续构造兄弟节点    
  66.     {    
  67.         if (ch==',')                    //当前字符为','    
  68.             g->link=CreateGL(s);        //递归构造兄弟节点    
  69.         else                            //没有兄弟了,将兄弟指针置为NULL    
  70.             g->link=NULL;    
  71.     }    
  72.     
  73.     return g;                           //返回广义表g    
  74. }    
  75.     
  76. void DispGL(GLNode *g)                  //输出广义表g    
  77. {    
  78.     if (g!=NULL)                        //表不为空判断    
  79.     {    
  80.         //先处理g的元素    
  81.         if (g->tag==0)                  //g的元素为原子时    
  82.             printf("%c", g->val.data);  //输出原子值    
  83.         else                            //g的元素为子表时    
  84.         {    
  85.             printf("(");                //输出'('    
  86.             if (g->val.sublist==NULL)   //为空表时    
  87.                 printf("#");    
  88.             else                        //为非空子表时    
  89.                 DispGL(g->val.sublist); //递归输出子表    
  90.             printf(")");                //输出')'    
  91.         }    
  92.         if (g->link!=NULL)    
  93.         {    
  94.             printf(",");    
  95.             DispGL(g->link);            //递归输出后续表的内容    
  96.         }    
  97.     }    
  98. }    
[cpp] view plain copy
  1. //3.测试函数:main.cpp,完成相关的测试工作;  
  2. #include <stdio.h>    
  3. #include "glist.h"    
  4. int main()    
  5. {    
  6.     GLNode *g;    
  7.     char *s="(b,(b,a,(#),d),((a,b),c((#))))";    
  8.     g = CreateGL(s);    
  9.     DispGL(g);    
  10.     printf("广义表长度:%d\n", GLLength(g));    
  11.     printf("广义表深度:%d\n", GLDepth(g));    
  12.     return 0;    
  13. }    
运行结果:

0 0