您的位置:首页 > 理论基础 > 数据结构算法

数据结构学习总结(三)广义表

2015-07-18 00:47 309 查看

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中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: