表的抽象数据类型(abstract data type,ADT)

时间:2022-08-27 16:10:56

  抽象数据类型(abstract data type,ADT)是带有一组操作的一些对象的集合。


表ADT

  我们将处理形如A0,A1,A2,A3,...,AN-1的一般的表,我们说这个表的大小是N。我们将大小为0的特殊的表称为空表(empty list)。

  我们说Ai后继Ai-1(或继Ai-1之后,i<N)并称Ai-1前驱Ai(i>0)。我们可以添加一些操作,比如next和previous,它们会取一个位置作为参数并分别返回其后继元和前驱元的位置。


表的简单数组实现

  下面程序段解释一个数组arr在必要的时候如何被扩展:

int[] arr = new int[10];

...

//下面我们决定需要扩大arr
int[] newArr = new int[arr.length * 2];
for(int i=0;i<arr.length;i++){
newArr[i] = arr[i];
}
arr = newArr;

简单链表

  为了避免插入和删除的线性开销,我们需要保证表可以不连续存储。

表的抽象数据类型(abstract data type,ADT)

这些节点不必在内存中相连。每一个节点均含有表元素和到包含该元素后继元的节点的链(link)。我们称之为next链。最后一个单元的next链引用为null。


remove方法可以通过修改一个next引用来实现:

表的抽象数据类型(abstract data type,ADT)

insert方法需要使用new操作符从系统取得一个新节点:

表的抽象数据类型(abstract data type,ADT)

典型的链表拥有到该表两端的链。删除最后一项比较复杂,因为必须找出指向最后节点的项,把它的next链改成null,然后再更新持有最后节点的链。在经典的链表中,每个节点均存储到其下一节点的链,而拥有指向最后节点的链并不提供最后节点的前驱节点的任何信息。

  保留指向最后节点的节点的第3个链的想法行不通,因为它在删除操作期间也需要更新。我们的做法是,让每一个节点持有一个指向它在表中的前驱节点的链我们称之为“双链表”。

  双链表:

表的抽象数据类型(abstract data type,ADT)