1. 广义表
1思想
广义表可以说是线性表的一种泛型定义,它与线性表的主要区别是,广义表的一个数据单元记录的可以是数据本身,也可以记录一个存储数据的线性表。在C++中实现为vector<vector<>>模板类,而C#中则为数组的数组(形如[datatype][][] variableName的定义)。当然,无论是C++的vector<vector<>>还是C#的数组的数组,它们也只是实现了广义表的二级深度,而广义表可以是任意深度的。3级深度的广义表示意图如下:
特别注意的是,C、C++、Java中的多维数组可以看作是特殊的广义表:因为在C、C++、Java中多维数组也是作为数组的数组实现的,与C#中的数组的数组的实现不同的是,C/C++/Java中每个一维数组长度都是相同的。在C/C++中动态分配的多维数组,其一维数组之间的空间分配不连续,而非动态分配的则连续;然而,无论空间分配是否连续,它们都是作为数组的数组实现的,遍历整个多维数组需要多个迭代器。另外,C#中的多维数组其实现应该说是一个定长的线性表(数组实现),其空间分配是连续的,且遍历整个多维数组可以只用一个迭代器。
2实现原理
由于线性表可以由数组以及链表实现,我们不难想到,广义表可以由纯数组,纯链表或者两者的混合实现。
使用纯链表的实现:
用纯链表的实现,首先要定义一个节点类型,这个类型不仅可以存储数据本身,还可以存储一个链表。在C语言中,可以这样定义:
typedefstructgl_node
{
intflag;//mark this node store data or a list
union{
intdata;//store data
structgl_node*head;//head pointer of list
};//content contained
structgl_node*next;
}glist_node;
可以到百度云: http://pan.baidu.com/s/1rsMZW或 GitHub:https://github.com/githubligao/Data-Structure.git上下载我的实现代码。
线性表的实现存放在GeneralList文件夹中的头文件int_GeneralList.h中。