线性表
我们都知道是一种常用的数据结构,也是历来各种考试的重点。今天抽了一些时间把线性表做了总结。
线性表是n个数据元素的一个有限序列。用公式表示为:
L=(a1,a2,a3,a4,………..an)
因为线性表是一个有限的序列,所以也如上面公式所示,它的各个元素是相继排放的。那么它的每个相连的两项之间都是有一个逻辑关系。那就是直接前驱和直接后继的关系。我们说除了第一个表项外,所有表项都有直接前驱。除了最后一个表项外。所有表项都有直接后继。线性表是唯一存在着这种关系的结构。线性表至多拥有一个直接前驱,一个直接后继。这就是线性表的基本特点了。
下面重点说顺序表。
顺序表
我们都知道线性表按照其存储表示不同,分为顺序表和链表。所谓顺序表就是以数组作为存储结构的。(链表后面再说)。那么该如何定义呢??简单来说,顺序表是按其逻辑顺序从指定的位置开始的一块连续存储区域。如果实在不能理解就是可以类比数组。顺序表的各个表项的逻辑顺序与其物理顺序是一致的。也就是说第n个表项存储在第n个物理位置。另外,顺序表最重要的特点就是它是支持顺序访问,也支持随机访问。怎么理解两种访问呢。第一,顺序访问:也就是从第一个表项开始逐次遍历,直到找到目标表项。而随机访问呢。就不言而喻了。就是不需遍历。直接访问元素。一般通过下标来直接确定。非常便捷。时间复杂度是o(1);
刚才说了。顺序表可以用数组来表示。那么原理是什么呢。其实很简单。我们只需申请一块数组空间就行了。要注意数组的大小不能小于表项的个数。顺序表的第一个表项存储在数组的第一个位置,也就是第0的位置。。
依次类推。那么第n个表项就存储在数组的第n-1个地方。书上有个公式比较准确的可以描述:
loc(i)=loc(1)+n-1*sizeof(t);
那么怎样用代码来表示呢。
可以这样来做
typedef struct {
typename data[maxsize];
int n;
}list;
上面的代码是静态存储表示。这个存储是有bug的。如果表项的数量比预设数组的大小要大。那么就会溢出。最好的是设一个动态的存储表示