【数据结构】回顾表ADT

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));
}


欢迎大家点击左上角的“关注”或右上角的“收藏”方便以后阅读。


为使本文得到斧正和提问,转载请注明出处:
http://blog.csdn.net/nomasp

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值