您的位置:首页 > 其它

软考--线性表操作

2015-10-25 20:03 260 查看
       本文对于线性表中常见的几种操作(插入、删除、查找、读取)从横纵两个维度进行总结。

       Firstly,涉及到这四种操作的线性表分类如下:(队列和栈属于特殊的线性表)

                                             


         下面分别从四种操作逐一展开分析:

    删除

          (1) 顺序表

                                                    


             如图,当要删除顺序表中的元素“8”,直接将表长减一即可;如果删除元素“4”,节点5/6/7/8依次向左移动一个位置(覆盖掉元素“4”),之后将表长度减一。

       (2) 链表

         1、单链表:

                                                     


              删除节点a2,将节点a1的指针域指向节点a3的数据域,pànext=pànextànext ,然后释放掉a2 即free(q)(单项循环链表同上)

 

         2、双链表:

                                 


               首先p-->prior-->next=p-->next,其次p-->next-->prior=p-->prior;之后free(p)释放掉a2的内存。(双向循环链表同上)

 

            其中,对于顺序表而言,删除算法执行时,平均移动节点次数为(n-1)/2,即时间复杂度为O(n)。而对于链表虽然操作仅仅是将要删除的节点的直接前驱指向直接后继,但是这之前需要定位该节点,So,时间复杂度仍然为O(n),但是只要细心就会发现,在西塞视频里所讲,链式存储结构的删除运算,时间复杂度为O(1),很是费解。

  插入

     (1)顺序表

            对应上图所示,现将第i个位置之后的元素向后挪一个单位,把新的节点插入到顺序表当中,时间复杂度仍然为O(n)。

 

     (2) 链表

         1、单链表

                     


               操作如下:s-->next=pànext,然后p-->next=s

 

         2、双链表

                     


                操作如下:(1)q-->prior=p   (2)q-->next=p-->next   (3)p-->next-->prior=q    (4)p-->next=q  四个步骤的顺序不能颠倒

  

                由此可见,插入操作同删除操作,由于都需要进行定位操作,课本上的时间复杂度均为O(n),再次和希赛视频的结果不同。

              ( 如图:前者为顺序存储,后者为链式存储)
                    


  定位(按值查找)

            线性表:对给定表元素的值,找出这个元素的位置。

            单链表:给定一个结点的值,找出这个结点是单链表的第几个结点。

            查找顺序都是从头向尾的方向进行,知道找到需要的结点或元素,时间复杂度为O(n)。

 

  求表长

                  


          如图所示的单链表,head为头指针,黑白结点为头结点,首结点为a1,尾结点为an,则该线性表的表长为n。

          求表长的运算仅仅对于链表适用。

 

  读表元素(按位置查找)

        对于链表,原理同求表长,从头进行扫描去读出位置为i的结点的值,时间复杂度为O(n)。

        对于顺序表,通过找到第一个表元素,加上偏移量,即得出表中元素的值,时间复杂度为O(1)。

        这一点二者需要严格区分。

 

   比较(按值&按位置)

         对于定位,前者给定的是具体的值,只能从头到尾去扫描,故对于顺序表和链表的时间复杂度均为O(n);

         对于读表,相当于按位置查找,在顺序表上“第一个元素+偏移量”即可,时间复杂度O(1),在链表上,仍需从头扫描,时间复杂度O(n)。这两点是个难点。

  

   扩展:队列

          在数据结构课本和软考视频里,对于队列队首和队尾指针的位置的讲解稍稍不同,原理一致,大家要注意。
                                   


           对于循环队列在软考过程中经常涉及,总结要点如下:

        (1) 队列满情况:(CQ.rear+1)%maxsize==CQ.front

        (2)队列空情况:CQ.rear==CQ.front

        (3)注意rear在题中表示的是队列队尾元素的实际位置还是队尾元素之后的位置。

 

          线性表的操作是软考里数据结构部分的一个重要考点,问题基本上就是这几类,欢迎大家继续和我交流。
          That’s all.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: