由于广义表中的数据元素可以是原子,也可以是广义表,显然难以用顺序存储结构表示之,并且为了在存储结构中便于分辩原子和子表,令表示广义表的链表中的结点为"异构"结点,如右侧图所示, 结点中设有一个"标志域tag", 并约定 tag=0 表示原子结点,tag=1 表示表结点。原子结点中的 data 域存储原子,表结点中指针域的两个值分别指向表头和表尾。用C语言描述上述广义表的结点结构如下:

  // 广义表的存储表示
  typedef enum {ATOM=0, LIST=1} ElemTag;
                 // ATOM(=0)标志原子,LIST(=1)标志子表
  typedef struct GLNode {
   ElemTag tag;       // 公共部分,用于区分原子结点和表结点
   union {         // 原子结点和表结点的联合部分
    AtomType data;     // data是原子结点的值域,AtomType由用户定义
    struct {struct GLNode *hp, *tp;} ptr;
        // ptr是表结点的指针域,ptr.hp和ptr.tp分别指向表头和表尾
  }
 } *GList;          // 广义表类型

  例如,广义表 L=(a,(x,y),((z)) 的存储结构如右图所示。它可由对L进行表头和表尾的分析得到。动画
 
 原子结点
 

 表结点