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

来源:互联网 发布:手机做电子相册的软件 编辑:程序博客网 时间:2024/06/08 19:48

glist.h:


  1. #include <stdio.h>  
  2. #include <malloc.h>  
  3. typedef char ElemType;  
  4. typedef struct lnode  
  5. {  
  6.     int tag;                             //标识节点类型  
  7.     union  
  8.     {  
  9.         ElemType data;                   //原子值  
  10.         struct lnode *sublist;           //指向子表的指针  
  11.     }val;  
  12.     struct lnode *link;                  //指向下一元素  
  13. }GLNode;                                 //定义 广义表节点类型  
  14.   
  15. int GLLength(GLNode *g);                 //求广义表g的长度  
  16. int GLDepth(GLNode *g);                  //求广义表g的深度  
  17. GLNode *CreateGL(char *&s);              //返回由括号表示法表示s的广义表链式存储结构  
  18. void DispGL(GLNode *g);                  //输出广义表g  

glist.cpp:

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include "glist.h"  
  2. int GLLength(GLNode *g)                 //求广义表g的长度  
  3. {  
  4.     int len=0;  
  5.     GLNode *g1;  
  6.     g1=g->val.sublist;  
  7.     while(g1!=NULL)  
  8.     {  
  9.         len++;  
  10.         g1=g1->link;  
  11.     }  
  12.     return len;  
  13. }  
  14. int GLDepth(GLNode *g)                  //求广义表g的深度  
  15. {  
  16.     GLNode *g1;  
  17.     int max=0,dep;  
  18.     if(g->tag==0)                       //原子返回0  
  19.         return 0;  
  20.     g1=g->val.sublist;                  //g1指向第一个元素  
  21.     if(g1==NULL)                        //空表返回1  
  22.         return 1;  
  23.     while(g1!=NULL)                     //遍历表中每一个元素  
  24.     {  
  25.         if(g1->tag==1)                  //元素为子表的情况  
  26.         {  
  27.             dep=GLDepth(g1);            //递归调用求子表深度  
  28.             if(dep>max)                 //max为同一层所求过的子表中深度的最大值  
  29.                 max=dep;  
  30.         }  
  31.         g1=g1->link;                    //g1指向下一元素  
  32.     }  
  33.     return (max+1);  
  34. }  
  35. GLNode *CreateGL(char *&s)              //返回由括号表示法表示s的广义表链式存储结构  
  36. {  
  37.     GLNode *g;  
  38.     char ch=*s++;                       //取一个字符  
  39.     if (ch!='\0')                      //串未结束判断  
  40.     {  
  41.         g=(GLNode *)malloc(sizeof(GLNode));//创建一个新节点  
  42.         if (ch=='(')                    //当前字符为左括号时  
  43.         {  
  44.             g->tag=1;                   //新节点作为表头节点  
  45.             g->val.sublist=CreateGL(s); //递归构造子表并链到表头节点  
  46.         }  
  47.         else if (ch==')')  
  48.             g=NULL;                     //遇到')'字符,g置为空  
  49.         else if (ch=='#')               //遇到'#'字符,表示为空表  
  50.             g=NULL;  
  51.         else                            //为原子字符  
  52.         {  
  53.             g->tag=0;                   //新节点作为原子节点  
  54.             g->val.data=ch;  
  55.         }  
  56.     }  
  57.     else                                 //串结束,g置为空  
  58.         g=NULL;  
  59.     ch=*s++;                            //取下一个字符  
  60.     if (g!=NULL)                        //串未结束,继续构造兄弟节点  
  61.     {  
  62.         if (ch==',')                    //当前字符为','  
  63.             g->link=CreateGL(s);        //递归构造兄弟节点  
  64.         else                            //没有兄弟了,将兄弟指针置为NULL  
  65.             g->link=NULL;  
  66.     }  
  67.   
  68.     return g;                           //返回广义表g  
  69. }  
  70. void DispGL(GLNode *g)                  //输出广义表g  
  71. {  
  72.     if(g!=NULL)                         //表不为空判断  
  73.     {  
  74.         if(g->tag==0)                   //g的元素为原子,输出原子值  
  75.             printf("%c",g->val.data);  
  76.         else                            //g的元素为子表,输出"("  
  77.         {  
  78.             printf("(");  
  79.             if(g->val.sublist==NULL)    //为空表时  
  80.                 printf("#");  
  81.             else  
  82.                 DispGL(g->val.sublist); //为非空子表时,递归输出子表  
  83.             printf(")");  
  84.         }  
  85.         if(g->link!=NULL)  
  86.         {  
  87.             printf(",");  
  88.             DispGL(g->link);            //递归输出g的兄弟  
  89.         }  
  90.     }  
  91. }  

main.cpp:

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include <stdio.h>  
  2. #include "glist.h"  
  3. int main()  
  4. {  
  5.     GLNode *g;  
  6.     char *s="(b,(b,a,(#),d),((a,b),c((#))))";  
  7.     g = CreateGL(s);  
  8.     DispGL(g);  
  9.     printf("\n广义表长度为:%d\n",GLLength(g));  
  10.     printf("广义表深度为:%d\n",GLDepth(g));  
  11.     return 0;  
  12. }  

运行结果:

0 0
原创粉丝点击