回顾表ADT的7点

1.对于表的所有操作来说,都可以使用数组来实现,而且数组虽然是静态分配的,但内部存储数组的vector类却允许在需要时将数组的大小增加一倍。

2.正是因为数组的实现,使得printList以线性时间来执行,而findkth甚至是通过常数时间。最不济的是插入和删除了,如果位置不好,比如说在0号位置插入就需要将整个数组的所有元素都向后移,为O(N)。正是为了避免插入和删除的线性开销,我们就开始使用一种叫做链表(Linked List)的技术。

3.链表由许多在内存中相连的结点(Node)组成,而每一个结点都有表元素和该元素后续元的结点的链(link)。这个叫做next链,自然而然地,最后一个单元的next链指向NULL。

4.STL的全称是“Standard Template Library”,中文名叫做“标准模板库”。表ADT就在其中。

5.数组就是一块指向内存的指针变量,内存块可以通过new[]来分配,同时也必须用delete[]来释放,内存块的大小不能改变。

6.将一个包含x的新结点通过p和p.prev指向的结点结合,指针的赋值可以按下面的方式来写。

Node *newNode=new Node(x,p->prev,p);
p->prev->next=newNode;
p->prev=neweNode;

但它还可以得到合并:

Node *newNode=new Node(x,p->prev,p);
p->prev=p->prev->next=newNode;

然后它还可以进一步合并:

p->prev=p->prev->next=new Node(x,p->prev,p);

因此可以这样来写insert操作:

iterator insert(iterator itr,const Object & x)
{
    Node *p=itr.current;
    theSize++;
    return iterator(p->prev=p->prev->next=new Node(x,p->prev,p));
}   

7.同样的,对于双向列表的delete操作来说,会是这样:

p->prev->next=p->next;
p->next->prev=p->prev;
delete p;

修改之后的insert函数。

iterator insert(iterator itr,const Object & x)
{
    itr.assertIsValid();
    if(itr.theList!=this)
        throw IteratorMismatchException();

    Node *p=itr.current;
    theSize++;
    return iterator(* this,p->prev=p-prev->next=new Node(x,p->prev,p));
}
时间: 2024-11-05 15:46:58

回顾表ADT的7点的相关文章

回顾栈ADT的7点

1.简单的说,栈就是只在一个位置上进行插入和删除操作的表,而这个特殊的位置就是表的末端,但这却不被成为栈的末端,而是顶(Top). 2.栈的基本操作时进栈和出栈,英文名分别是push和pop,分别相当于插入和删除.切记对空栈进行pop和top操作在栈ADT被认为是错误的,而如果push在空间之外进行操作也是有实现限制的,但这并不是ADT错误. 3.栈的特点是后进先出,对于学生来说可能用食堂里堆砌起来的餐盘做形容更加合适. 4.栈既可以用单向链表来实现,也可以用数组来实现.用单向链表自然是比较简单

线性链表之顺序表

顺序表中数据元素的存储地址是其序号的线性函数,只要确定了存储顺序表的起始地址(即 基地址),计算任意一个元素的存储地址的时间是相等的,具有这一特点的存储结构称为[随机存储]. 使用的基本数据结构:数组 特点:顺序存取,随机访问. /* Name: SeqList Copyright: 1.0 Author: Johnny Zen Date: 04/06/17 21:51 Description: 线性链表之顺序表 *//* Chinese:顺序(线性)表 English:SeqList*/#in

第三章节 表,栈,队列

抽象数据类型(abstract data type ADT)是带有一组操作的对象的集合. 一. 表ADT 表的数组实现  数组实现时,插入和删除的花费可能会比较大,这样要看操作发生在什么地方.最坏情况如,在0处插入,和删除第一个元素.此时为O(N). 如果表是通过在高端插入,其后只发生对数组的查找访问(findKth),则数组很适合.否则,不是. 简单链表 为了避免插入和删除的线性开销,应该使表可以不连续存储.否则表的每个部分都可能要整体移动.这样就是链表. findKth(i)要花费O(i)的

<数据结构与算法分析 C++描述> 表/栈/队列

这一章主要内容: * 抽象数据类型(ADT)的概念 * 实现表/栈/队列 * 了解这三个数据结构的应用场景 1. ADT ADT: abstract data type, 是抽象的数学模型,在该模型上定义了一系列的操作.使用它的人,不需要了解它的存储方式,只关心它的逻辑特征.可以使用三元组的方法来表示(D,S,P),D是数据对象,S是数据之间的关系,P是对数据的基本操作,具体介绍,可以参考帖子:点击打开链接 2. 表ADT 表的数据自然是单个元素,而元素之间的关系是前驱与后继,操作包括查找/插入

算法系列(六)数据结构之表队列和栈

在http://blog.csdn.net/robertcpp/article/details/51559333一文中,我们讲了排序,这一章来介绍一下基本数据结构:表.队列.栈和它们的简单实现 一.表ADT 1.数组实现顺序表 通过对数组操作,来直接对表进行增删查改操作,这种线性表查找某个位置的元素花费的时间为O(1),但是插入删除元素花费的时间为O(n),如果对表的操作更多的是访问操作,那么选择这种实现更为合适. 下面是一个简单实现 package com.algorithm.list; im

《数据结构与算法分析:C语言描述_原书第二版》CH3表、栈和队列_reading notes

表.栈和队列是最简单和最基本的三种数据结构.基本上,每一个有意义的程序都将明晰地至少使用一种这样的数据结构,比如栈在程序中总是要间接地用到,不管你在程序中是否做了生命. 本章学习重点: 理解抽象数据类型(ADT)的概念 学习如何对表进行有效的操作 熟悉栈ADT及其在实现递归方面的应用 熟悉队列ADT及其在操作系统和算法设计中的应用 ADT 抽象数据类型(abstract data type)是一个操作的集合,是数学的抽象,在ADT中不涉及如何实现操作的集合,这可以看作是模块化设计的扩充. 对于每

数据结构与算法分析(5)表、栈和队列(一)

      本节讨论最简单和最基本的三种数据结构:表,栈和队列. 每种程序都明晰地至少使用一种这样的数据结构,而栈在程序中总要间接地用到. 内容: 1.介绍抽象数据类型(ADT)的概念; 2.阐述如何对表进行有效的操作; 3.介绍栈ADT及其在实现递归方面的应用; 4.介绍队列ADT及其在操作系统和算法设计上的与应用. (1)抽象数据类型 程序设计的基本法则之一是:例程不应超过一页. 模块化的优点: 1)调试小程序比调试大程序容易的多: 2)多个人同时对一个模块式程序编程更加容易: 3)一个写得

表、栈和队列(1)

目录 1.抽象数据类型 2.表ADT 2.1.表的简单数组实现 2.2.简单链表 3.Java Collections API中的表 3.1.Collection接口 3.2.Iterator接口 3.3.List接口.ArrayList类和LinkedList类 3.4.例子:remove方法对LinkedList类的应用 3.5.关于ListInterator 本系列讨论最简单的和最基本的三种数据类型:表.栈和队列,实际上,每一个有意义的程序都将显式的用到一种或多种这样的数据结构,而栈在程序

自己动手实现java数据结构(五)哈希表

1.哈希表介绍 前面我们已经介绍了许多类型的数据结构.在想要查询容器内特定元素时,有序向量使得我们能使用二分查找法进行精确的查询((O(logN)对数复杂度,很高效). 可人类总是不知满足,依然在寻求一种更高效的特定元素查询的数据结构,哈希表/散列表(hash table)就应运而生啦.哈希表在特定元素的插入,删除和查询时都能够达到O(1)常数的时间复杂度,十分高效. 1.1 哈希算法 哈希算法的定义:把任意长度的输入通过哈希算法转换映射为固定长度的输出,所得到的输出被称为哈希值(hashCod