线性表

来源:互联网 发布:jsp 循环调用java方法 编辑:程序博客网 时间:2024/05/21 07:52

线性表


定义:零个或多个相同数据元素的有限序列。
两种物理结构:
1.顺序存储结构

  • 顺序存储结构:用一段地址连续的存储单元依次储存数据元素。
    存储器中每个存储单元都有自己的编号,这个编号就是地址。地址的计算方法的公式是:Loc(ai)=Loc(a1)+c*(i-1),loc是获取地址的函数,c是每个元素所占的存储单元。比如如果一个顺序表中第一个元素的存储地址为1000,每个元素占2个地址单元,那么,第5个元素的存储地址应是loc(a5)=1000+2*4=1008。
    这个公式可以随时得出任意元素的地址,就是你可以随时存取你想要那个数据。不管是那个元素,计算的时间都是一样的(都是O( 1))。
  • 插入与删除
    插入:在一个原有的顺序线性表中,插入一个元素。假如要在插入到i元素之前,先找到i的位置 将要插入位置后的数据元素都向后移一位,将要插入的元素的数据赋给i-1位置存储空间,表的元素数量都加一。
    删除:在一个原有的顺序线性表中,插入一个元素。假如要删除i位置上的元素,就将i位置之后的数据元素全都向前移一位。

  • 来看看上述操作的时间复杂度,如果要插入或删除的元素在最后一个,则不需要移动元素的位置。时间复杂度为O(1)。那如果要插入或删除的元素在第一个,则要移动n次元素的位置(假设线性表有n个元素),时间复杂度为O(n)。就是说要操作的位置越靠前,时间复杂度越大,反之越小。所以顺序线性表的缺点就暴露出来了。况且,每次要开辟一个足够大的空间,来装数据元素,开的大了,浪费空间。
    2.链式存储结构
    链式存储结构中的数据元素除了存储数据(数据域)外,还有一个存储其后继元素地址的(指针域)。指针域中存储的信息叫指针或链。这两部分信息组成的数据元素的存储映象,称为结点。每个结点都只有一个指向其后继的指针域,所以又被称为单链表。

  • 单链表的读取
    假设一个存在的单链表,你要找到其中的某个元素i,从头开始找,直到第i个结点,如果i=n,那么时间复杂度为O(n)。
  • 单链表的插入与删除
    要插入一个结点i,插在p与q之间,将p的指针域指向i,i的指针域指向q。
    要删除i结点,i结点在p与q之间,将p的指针域指向q,再将i结点释放。

  • 静态链表
    首先用数组的元素都是由两个数据域组成,data和cur。也就是说,数组的每个下表都对应一个data和一个cur。数据域data,用来存放数据元素,也就是通常我们要处理的数据;而cur相当于单链表中的next指针,存放该元素后继在数组中的下表,我们把cur叫做游标。把这种用数组描述的链表叫静态链表。

  • 循环链表
    将单链表中终端结点的指针由空指针改为指向头结点,就使整个单链表形成一个环, 这种头尾相接的单链表称为单循环链表。
    循环链表和单链表的主要差异就是在于循环的判断条件上,原来是判断p->next是否为空,现在则是p->next不等于头结点,则循环未结束。

  • 双向链表
    双向链表(double linked list)是在单链表的每个结点中,再设置一个指向其前驱结点的指针域。所以在双向链表中的结点都有两个指针域,一个指向直接后继,一个指向直接前驱。
原创粉丝点击