1、定义

    线性表是具有相同数据类的n个数据元素的有限序列。

2、特点


  • 表中元素个数有限。
  • 表中元素具有逻辑上的顺序性。
  • 表中元素都是数据元素,每个元素都是单个元素。
  • 表中的元素数据类型相同,即每个元素占用的相同的存储空间。 

3、线性表的基本操作

InitList(&L);//初始化表
Length(L);//求表长,返回线性表的长度。
LocateElem(L,e);//按值查找。在表中找到具有给定关键字的元素。
GetElem(L,i);//按位查找,获取表中第i个位置的元素的值。
ListInsert(&L,i,e);//插入操作,在表中第i个位置上插入元素e。
ListDelete(&L,i,e);//删除操作,删除表中第i个位置上的元素,并用e返回删除元素的值。
PrintList(L);//输出操作,按顺序输出线性表中的值。
Empty(L);//判空操作。
DestroyList(&L)//销毁操作。

4、顺序表示

  • 它是用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。
  • 顺序表的特点就是表中元素的逻辑顺序与其物理顺序相同。
  • 假定线性表的数据类型为Elemtype,则线性表的顺序存储类型描述为:
    #define MaxSize 50   //定义线性表的最大长度
    typedef struct{
        ElemType date[MaxSize];   //顺序表的元素
        int length;      //顺序表当前长度
    }SqList;             //顺序表的类型定义
  • 一维数组可以静态分配,也可以动态分配。动态分配的语句为:
    L.data = (ElemType*)malloc(sizeof(ElemType)*InitSize);
  • 顺序表的最主要特点是随机访问。
  • 顺序表在逻辑上相邻的元素物理上也相邻,所以删除和插入操作需要移动大量元素。

顺序表上基本操作的实现

(1)插入操作:
bool ListInsert(SqList &L,int i,ElemType e){
    if(i<1||i>L.length+1){     //判断i的范围是否有效
        return false;
    }
    if(L.length>=MaxSize){    //当前存储空间已满,不能插入
        return false;
    }
    for(int j=L.length;j>=i;j++){   //将第i个以后的元素向后移动
        L.data[j] = L.data[j-1];
    }
    L.data[i-1] = e;     //第i个位置放入e
    L.length++;         //线性表的长度+1
    return true;
}
线性表插入算法的平均时间复杂度为O(n)