滴水逆向联盟

标题: VC++2012编程演练数据结构《16》广义表 [打印本页]

作者: 大灰狼    时间: 2014-9-2 07:56
标题: VC++2012编程演练数据结构《16》广义表
广义表是一种非线性的数据结构,顾名思义,它也是线性表的一种推广。它被广泛的应用于人工智能等领域的表处理语言LISP语言中。在LISP语言中,广义表是一种最基本的数据结构,就连LISP 语言的程序也表示为一系列的广义表。
线性表被定义为一个有限的序列(a1,a2,a3,…,an)其中ai被限定为是单个数据元素。广义表也是n个数据元素d1,d2,d3,…,dn的有限序列,但不同的是,广义表中的di 则既可以是单个元素,还可以是一个广义表,通常记作:GL=(d1,d2,d3,…,dn)。GL是广义表的名字,通常广义表的名字用大写字母表示。n是广义表的长度。若其中di是一个广义表,则称di是广义表GL的子表。在广义表GL中,d1是广义表GL的表头,而广义表GL其余部分组成的表(d2,d3,…,dn)称为广义表的表尾。由此可见广义表的定义是递归定义的。因为在定义广义表时,又使用了广义表的概念。
  l D=() 空表;其长度为零。
  l A=(a,(b,c)) 表长度为2的广义表,其中第一个元素是单个数据a,第二个元素是一个子表(b,c)。
  l B=(A,A,D) 长度为3的广义表,其前两个元素为表A,第三个元素为空表D。
  l C=(a,C) 长度为2递归定义的广义表,C相当于无穷表C=(a,(a,(a,(…))))。
  其中,A,B,C,D是广义表的名字。下面以广义表A为例,说明求表头、表尾的操作如下:
  head(A)=a; 表A的表头是:a
  tail(A)=((b,c)); 表A的表尾是((b,c))。广义表的表尾一定是一个表。
 (1) 广义表的元素可以是子表,而子表还可以是子表…,由此,广义表是一个多层的结构。
  (2) 广义表可以被其他广义表共享。如:广义表B就共享表A。在表B中不必列出表A的内容,只要通过子表的名称就可以引用该表。  周游广义表(3) 广义表具有递归性,如广义表C。

  由于广义表GL=(d1,d2,d3,…,dn)中的数据元素既可以是单个元素,也可以是子表,因此对于广义表,我们难以用顺序存储结构来表示它,通常我们用链式存储结构来表示。表中的每个元素可用一个结点来表示。广义表中有两类结点,一类是单个元素结点,一类是子表结点。从上节得知,任何一个非空的广义表都可以将其分解成表头和表尾两部分,反之,一对确定的表头和表尾可以唯一地确定一个广义表。由此,一个表结点可由三个域构成:标志域,指向表头的指针域,指向表尾的指针域。而元素结点置需要两个域:标志域和值域。

打开IDE

我们创建一个工程


类的声明如下


[cpp] view plaincopy






类的实现如下


[cpp] view plaincopy






类的调用如下


[cpp] view plaincopy


  • #include "stdafx.h"  
  • #include "guangyi.h"  
  • static GList *GL,*GL1,*GL2,*GL3;  
  • static GList GU,GU1,GU2,GU3,GU4;  
  • void main()  
  • {cout<<"运行结果:\n";  
  • char *a="(A,(B),(3,5,7),(a,b),((C)),D)";  
  • char *b="(A,(B),(3,5),(a,b),7)";  
  • char *c="(9,(B),(3,5),(a,b))";  
  • GU3.utype=INTGR;GU3.intinfo=9;  
  • GU3.first=GL2;  
  • GL=GU.CreateGList(a);  
  • cout<<"返回的指针值GL="<<GL<<endl;  
  • cout<<"创建后的广义表=";  
  • GU.prtGlist(GL);  
  • cout<<"\n广义表GL的深度="<<GU.depth(GL);  
  • GL=GU.delvalue(GL,5);  
  • cout<<"\n删除5后的广义表GL=";GU.prtGlist(GL);  
  • GL=GU.delvalue(GL,'a');  
  • cout<<"\n删除a后的广义表GL=";GU.prtGlist(GL);  
  • cout<<"\n将GU3定义为由ls指示的广义表的尾:";  
  • GU.setTail(GL,GU3);GU.prtGlist(GL);  
  • cout<<"\n重置广义表的头元素后的广义表:";  
  • GU.setHead(GL,GU3);GU.prtGlist(GL);  
  • GL1=GU.Copy(GL);  
  • cout<<"\n复制后的广义表GL1=";  
  • GU.prtGlist(GL1);  
  • cout<<"\n广义表GU的第一个元素的值:\n";  
  • GU2=GU.Head(GL1);  
  • cout<<"GU2.utype="<<GU2.utype;  
  • if(GU2.utype==INTGR)  
  • cout<<",GU2.intinfo="<<GU2.intinfo<<endl;  
  • if(GU2.utype==CH)  
  • cout<<",GU2.charinfo="<<GU2.charinfo<<endl;  
  • GU=GU.Info(GL1);  
  • cout<<"广义表GU的第一个元素的值:\n";  
  • cout<<"GU.utype="<<GU.utype;  
  • if(GL1->utype==INTGR)  
  • cout<<",GU.intinfo="<<GU.intinfo<<endl;  
  • if(GL1->utype==CH)  
  • cout<<",GU.charinfo="<<GU.charinfo<<endl;  
  • GL2=GU1.CreateGList(b);  
  • if(GU.operator ==(GU1)) cout<<"广义表GU与GU1相等!\n";  
  • else cout<<"广义表GU与GU1不等!\n";  
  • cout<<"修改广义表GU1的表头后的广义表:";  
  • GL2=GU1.InsertGL(GL2,GU3);  
  • GU1.prtGlist(GL2);  
  • GU1=*GL2;  
  • cout<<"\n广义表GU1除第一个元素以外其它元素组成的表:";  
  • GL2=GU1.Tail();cout<<'(';  
  • GU1.prtGlist(GL2);cout<<endl;  
  • GL3=GU4.CreateGList(c);  
  • cout<<"创建后的广义表=";  
  • GU4.prtGlist(GL3);  
  • cout<<"\n以GU3为头,由GL3指示的广义表为尾的新表:";  
  • GU3.utype=CH;GU3.charinfo='F';  
  • GU3.first=NULL;  
  • GL3=GU4.Addon(GL3,GU3);cout<<'(';  
  • GU4.prtGlist(GL3);cout<<')';  
  • getch();  
  • }  





效果如下







欢迎光临 滴水逆向联盟 (http://www.dtdebug.com/) Powered by Discuz! X3.2