广义表的头尾链表存储表示:
typedef enum {ATOM, LIST}ElemTag; //ATOM=0:原子;LIST=1:子表
typedef struct GLNode
{
ElemTag tag; //公共部分,用于区分原子节点和表节点
union{ //原子节点和表节点的联合部分
AtomType atom; //atom是原子节点的值域,AtomType由用户定义
struct{struct GLNode *hp,*tp;}ptr;
//ptr是表节点的指针域,ptr.hp和ptr.tp分别指向表头和表尾
};
}*GList; //广义表类型
广义表的此种存储结构有三种特点:
(1)、除空表的表头指针为空外,对任何非空列表,其表头指针均指向一个表节点,且该节点中的hp域指向列表表头(或为原子节点,或为表节点),tp域指向列表表尾(除非表尾为空,则指针为空,否则必为表节点)
(2)、容易分清列表中原子和子表所在层次。
(3)、最高层的表节点个数即为列表的长度。
广义表的扩展线性链表存储表示
ypedef enum {ATOM, LIST}ElemTag; //ATOM=0:原子;LIST=1:子表
typedef struct GLNode
{
ElemTag tag; //公共部分,用于区分原子节点和表节点
union{ //原子节点和表节点的联合部分
AtomType atom; //atom是原子节点的值域,AtomType由用户定义
struct GLNode *hp;
//表节点的表头指针
};
struct GLNode *tp; //相当于线性链表的next,指向下一个元素节点
}*GList;
以上两种结构根据习惯来掌握,掌握一中即可。
typedef enum {ATOM, LIST}ElemTag; //ATOM=0:原子;LIST=1:子表
typedef struct GLNode
{
ElemTag tag; //公共部分,用于区分原子节点和表节点
union{ //原子节点和表节点的联合部分
AtomType atom; //atom是原子节点的值域,AtomType由用户定义
struct{struct GLNode *hp,*tp;}ptr;
//ptr是表节点的指针域,ptr.hp和ptr.tp分别指向表头和表尾
};
}*GList; //广义表类型
广义表的此种存储结构有三种特点:
(1)、除空表的表头指针为空外,对任何非空列表,其表头指针均指向一个表节点,且该节点中的hp域指向列表表头(或为原子节点,或为表节点),tp域指向列表表尾(除非表尾为空,则指针为空,否则必为表节点)
(2)、容易分清列表中原子和子表所在层次。
(3)、最高层的表节点个数即为列表的长度。
广义表的扩展线性链表存储表示
ypedef enum {ATOM, LIST}ElemTag; //ATOM=0:原子;LIST=1:子表
typedef struct GLNode
{
ElemTag tag; //公共部分,用于区分原子节点和表节点
union{ //原子节点和表节点的联合部分
AtomType atom; //atom是原子节点的值域,AtomType由用户定义
struct GLNode *hp;
//表节点的表头指针
};
struct GLNode *tp; //相当于线性链表的next,指向下一个元素节点
}*GList;
以上两种结构根据习惯来掌握,掌握一中即可。