线性表(1)定义与操作
定义
线性表描述的是一种逻辑结构,线性表中的元素具有线性的逻辑关系,这里的线性具体就体现在:
线性表中的每一个元素,除了第一个元素,其他元素都有唯一前驱;除了最后一个元素,其他元素都有唯一后继。
可以说,这里的前驱和后继的概念就是描述了线性表的线性性,形象一点的,每一个元素和其前驱以及后继相连,这样子连起来,就是一条线,于是我们叫它线性表。
线性表除了线性性,还有两个其他的重要性质:相同类型,有限。这里要求线性表中的元素具有相同类型(当然也可以是结构体这样的复合类型),并且元素的个数是有限的。
总结起来,线性表就是相同类型,有限,有序。这里的有序指的就是线性性,线性性的前驱和后继就暗含了一种顺序,某某元素的前驱在该元素的前面,某某元素的后继在该元素的后面。
逻辑结构和存储结构
这里我们要区分两个概念,逻辑结构和存储结构。我们说线性表是一种逻辑结构,那么什么是逻辑结构呢?逻辑结构描述了数据元素之间的逻辑关系,比如线性表中的元素具有线性的逻辑关系,无向图的元素之间有相邻/不相邻这样的逻辑关系。与存储结构相对应的,还有一个概念是存储结构。存储结构描述了逻辑结构在计算机内存中的存储方式。
上面的说法很抽象,不过没关系,我们举个例子,对于图这个逻辑结构,其概念只涉及了图中的数据以及数据之间的关系,而邻接表这个存储结构则涉及到了数据以及数据之间的关系的表示,在邻接表中我们需要考虑怎么表示点,怎么表示边(也可以看作点之间的关系),因此逻辑结构和存储结构最大的区别就是,是否涉及数据和数据关系的表示,比如用第\(i\)个链表表示第\(i\)个点,而第\(i\)个链表中的元素表示与第\(i\)个点相邻的点(也就是点之间的关系)。
总结来说,区分这两个概念的关键就在于是否涉及表示.
操作
总结起来,一共有这几个基本操作:创建销毁,增删查改
InitList(&L)
:该操作对表进行初始化。DestoryList(&L)
:该操作销毁一个表,并释放表的空间。ListInsert(&L, i, e)
:在第\(i\)个位置插入元素\(e\)。ListDelete(&L, i, &e)
:删除第\(i\)个位置的元素,并用\(e\)返回被删除的元素。LocateElem(L, e)
:查找值为\(e\)的元素的位置,是按值查找。GetElem(L, i)
:查找第\(i\)个位置的元素,是按位查找。- 至于改这个操作,可以先定位要删除的元素,再删除该元素,最后再相同的位置插入想要改成的元素,这样等效于一个修改操作。
至于其他的还有用于获取表长、打印表、判空等操作。
什么时候是引用
注意到上面这些操作的参数,有些是引用,有些则不是,主要还是看哪些操作需要修改表的内容。
上面的初始化和销毁肯定是需要修改表的,而插入,删除,改变了表的元素,自然也是需要传入引用。而查找/定位元素的操作,则不需要修改表本身,只需传入表的形参就可以了。
参考资料
- [1] 王道数据结构考研复习指导