基本操作:

 {结构初始化}
  InitGList(&L);
   操作结果:创建空的广义表 L。

  CreateGList(&L, S);
   初始条件:S是广义表的书写形式串。
   操作结果:由S创建广义表 L。

  CopyGList(&T, L);
   初始条件:广义表 L 存在。
   操作结果:由广义表 L 复制得到广义表 T。

 {销毁结构}
  DestroyGList(&L);
   初始条件:广义表 L 存在。
   操作结果:销毁广义表 L。
 
 
 例如,以下为以"字符串"书写形式表示的广义表。
  A=()
  F=(b,(c,d,e))
  E=(b,(c),(d,e))
  D=(E,A,F)
  C=(A,D,F)
  B=(a,B)=(a,(a,(a,v...)))

  通常,以大写的字母表示广义表的表名,而用单个的小写字母表示单原子。
 
   {引用型操作}
  GListLength(L);
   初始条件:广义表 L 存在。
   操作结果:求广义表 L 的长度,即元素个数。

  GListDepth(L);
   初始条件:广义表 L 存在。
   操作结果:求广义表 L 的深度。
 
 

  例如,广义表F的长度为2,广义表 E 的长度为3,可见广义表中元素的"个数"应由最外层括弧中的"逗号"来定。

  广义表的深度定义为括弧嵌套的最深层次。因此对广义表来说,"空表"的深度为1,广义表E和F的深度都为2。
 

 
    GListEmpty(L);
   初始条件:广义表 L 存在。
   操作结果:判定广义表 L 是否为空表。

  GetHead(L);
   初始条件:广义表 L 存在且非空。
   操作结果:返回广义表 L 的表头。

  GetTail(L);
   初始条件:广义表 L 存在且非空。
   操作结果:返回广义表 L 的表尾。

 {加工型操作}
  InsertFirst_GL(&L, e);
   初始条件:广义表 L 存在。
   操作结果:插入元素 e 作为广义表 L 的第一个元素。

  DeleteFirst_GL(&L, &e);
   初始条件:广义表 L 存在。
   操作结果:删除广义表 L 中第一个元素,并用 e 返回其值。

  Traverse_GL(L, Visit());
   初始条件:广义表 L 存在。
   操作结果:遍历广义表 L,用函数 Visit 处理每个元素。

} ADT GList
 
  例如,A=( )为空表,因为表中没有元素。


  从上面对广义表的表头和表尾的定义可见,这两个操作只对非空表有意义,且由于广义表的表头定义为表中"第一个"数据元素,因此它可能是单原子,也可能是个广义表,而它的表尾"必定"是个广义表,但可能是个空的广义表。例如,
  GetHead(F)=b,GetTail(F)=((c,d,e))=F1
  GetHead(F1)=(c,d,e)=F2,GetTail(F1)=( )
  GetHead(F2)=c,GetTail(F2)=(d,e)=F3
  GetHead(F3)=d,GetTail(F3)=(e)=F4
  GetHead(F4)=e,GetTail(F4)=( )

  思考题 能否利用这两个基本操作实现"将 e 插入为广义表 L 的第 i 个元素"或"删除广义表的第 i 个元素"呢?