数据结构---线性表----顺序存储结构

1.线性表定义
        线性表(LIST):零个或多个数据元素的有限序列。
   关键知识点:
        1.首先它是一个序列,元素之间室友顺序的;
        2.线性表强调的是有限的,元素个数是有限的;
        3.在较复杂的线性表中,一个数据元素可以由若干个数据项组成。
        其数学定义:
        若将线性表标记为( a 1,  …,a i-1 , a i , a i+1 , …, a n ),则表中的 a i-1领先于ai,ai领先 于ai+1  ,称ai-1是ai的直接前驱元素。 ai+1是ai的直接后继元素。
       线性元素的个数n(n>=0)定义为线性表的长度,当n=0时称为空表。
       线性表知识框架
2.线性表的抽象数据类型
ADT 线性表

Data
    线性表的数据对象集合为(a1, …,ai-1, ai, ai+1, …, an),每个元素的类型均为DateType。其中,除了第一个元素a1外,每一个元素都有且只有一个直接前驱元素,除了最后一个元素外,每一个元素都有且只有一个直接后继元素。数据元素之间的关系是一对一的关系。

Operation
    InitList(*L);                  初始化操作,建立一个空的线性表L;
    ListEmpty(L);                 若线性表L为空,返回True, 否则返回False;
    ClearList(*L);                  清空线性表;
    GetElem(L, i, *e);        将线性表L中的第i个位置的元素值返回给e;
    LocateElem(L, e);            在线性表L中查找与e相等的元素,如果查找成功,返回该元素                                  
                                              在表中的序号表示成功,否则返回0表示失败;
    ListInsert(*L, i, e);           在线性表L的第i个位置插入新元e;
    ListDelete(*L, i, *e);        删除线性表L中第i个位置的元素,并返回e;    
    ListLength(L);                 返回线性表L的元素个数;

endADT   

3.线性表的顺序存储结构
       顺序存储定义:
            线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。 
        线性表顺序存储的结构代码:
        #define MAXSIZE 20          /*存储空间的初始分配数量*/
        typedef int Elemtype;       /*ElemType 类型根据实际情况定*/
        typeof struct
        {
                ElemType data[MAXSIZE ];     /*数组存储数据元素,最大值为MAXSIZE*/
                int length;                               /*线性表的当前长度*/
        }SqList;


        注意  数据长度与线性表长度的区别        
    数据长度是指存储线性表的存储空间的长度,存储分配后这个是一般不会改变的。
    线性表的长度是线性表中元素的个数,随着线性表的插入和删除操作而变化。
    在任意时刻,线性表的长度应该小于等于数组的长度、

         地址计算方法:
         假设每个元素占用C个存储单元,那么线性表中第i个元素的存储位置与i+1 个数据元素的的存储位置的关系:
         LOC --- 获得存储位置的函数                   
          LOC(ai+1 ) = LOC(ai)+ C
          LOC(ai) = LOC(a1)+ (i-1)*C
4.顺序存储结构的插入与 删除

   线性表获得元素的操作  GetElem(L, i, *e)
      #define  OK  1 
      #define  ERROR  0
      #define  TRUE   1
      #define  FALSE 0
      typedef int Status ;
     /*Status 是函数的类型,其值是函数结果的状态代码, 如OK 等*/
    /*初始条件:顺序线性表L已经存在,1= L.length)
                    return  ERROR; 
        *e = L.data[i-1];
        return OK;
}


    插入操作 ListInsert(*L, i, e);
   算法描述:
      1. 如果插入位置不合理,抛出异常;
      2. 如果线性表长度大于数组长度,则抛出异常或者动态添加容量;
      3. 从最后一个元素开始向前遍历到第i个位置,分别将他们向后移动一个位置;
      4. 将要插如的元素填入到位置I处;
      5. 表长加1.
具体实现代码:
     
      /*初始条件:顺序线性表已经存在,1=length == MAXSIZE)             /*顺序线性表已经满*/
                        return ERROR;
                if (i<1 || i> L->length+1)                 /*i不在范围内*/
                        return ERROR;
                if (ilength)    
                {
                        for (k =L->length-1;k>=i-1;k--)
                                L->data[k+1]= L->data[k]; 
                }

                L->data[i-1] = e; 
                L->length++;                 
                return OK;
        }

       删除操作  ListDelete(*L, i, *e);
       算法描述

          1. 如果删除位置不合理,抛出异常;
          2. 取出删除的元素;
          3. 从删除元素开始向前遍历到最后一个元素,分别将他们向前移动一个位置;
          4. 表长减1.
具体实现代码:
   
    /*初始条件:顺序线性表已经存在,1= length == 0)/*线性表为空*/
                        return ERROR;
                
                if (i<1 || i> L->length)                 /*i不在范围内*/
                        return ERROR;
                *e = L->length
                if (ilength)    
                {
                         for (k =i;klength;k++)
                                L->data[k-1]= L->data[k]; 
                }
                    
                L->length++ ; 
                return OK;
       }
插入和删除的时间复杂度:由于元素插入到第i个位置,或者删除第i个元素,需要移动n-i个元素。根据概率原理,每个位置插入或者删除元素的可能性是一样的。也就是说最终的平均移动次数和最中间那个元素的移动次数相等。都是(n-1)/2.因此平均时间复杂度为O(n)。
这表明:线性表的顺序存储结构,在存储数据时,不管那个位置时间复杂度都是O(1),而在插入和删除时,时间复杂度为O(n),说明它比较适合在元素个数不太变化,而更多是存取数据的应用。

线性表顺序存储结构的优缺点:
 优点: 1.无须为表示表中元素之间的逻辑观念而增加额外的存储空间。
                    2.可以快速地存取表中任意位置的元素。
 缺点: 1. 插入和删除操作需要移动大量的元素。  
                2. 当线性表长度变化较大时,难以确定存储空间的容量。
                3.造成空间的“碎片”。


你可能感兴趣的:(笔记,基础知识复习)