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

来源:互联网 发布:程序员是什么 编辑:程序博客网 时间:2024/06/04 11:01
  1. /*    
  2. Copyright (c)2015,烟台大学计算机与控制工程学院    
  3. All rights reserved.    
  4. 文件名称:广义表算法库(1).cpp    
  5. 作    者:陈晓琳
  6. 完成日期:2016年10月27日    
  7. 版 本 号:v1.0    
  8.    
  9. 问题描述:   1)建立广义表算法库,包括:     
  10.             ① 头文glist.h,定义数据类型,声明函数;     
  11.             ② 源文件glist.cpp,实现广义表的基本运算,主要算法包括:    
  12.             int GLLength(GLNode *g);    //求广义表g的长度    
  13.             int GLDepth(GLNode *g);     //求广义表g的深度    
  14.             GLNode *CreateGL(char *&s); //返回由括号表示法表示s的广义表链式存储结构    
  15.             void DispGL(GLNode *g);     //输出广义表g    
  16.             ③ 设计main函数,测试上面实现的算法     
  17. 输入描述:   若干测试数据。    
  18. 程序输出:  广义表的深度。    
  19. */      

glist.h:


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


glist.cpp:

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


main.cpp:

[cpp] view plain copy
  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("广义表长度:%d\n", GLLength(g));      
  10.     printf("广义表深度:%d\n", GLDepth(g));      
  11.     return 0;      
  12. }      



运行结果:




知识点总结:

实现稀疏矩阵三元组表示的基本运算以及其主要算法。

心得:

比较难


0 0