线性表的顺序存储结构

1.顺序表:

线性表占用的存储空间=n*sizeof(ElemType)

n为线性表的长度,ElemType为线性表的元素类型,sizeof(ElemType)为每个元素所占存储空间大小(即字节数)

线性表的顺序存储结构利用数组实现,数组的基本类型是线性表中元素类型,数组大小大于等于线性表的长度。

基本运算实现:

(1)建立顺序表

  void CreateList(SqList *&L,ElemType a[],int n)    //由a中的n个元素建立顺序表
 {  int i;
    L=(SqList *)malloc(sizeof(SqList));    //分配存放线性表的空间
    for (i=0;i<n;i++)       //放置数据元素
      L->data[i]=a[i];      //设置长度
    L->length=n;
 }
(2)初始化线性表InitList

   void InitList(SqList *&L)   //引用型指针
  {

     L=(SqList *)malloc(sizeof(SqList));       //分配存放线性表的空间
     L->length=0;      //置空线性表长度为0
  }

时间复杂度为O(1)。

(3)销毁线性表

   void DestroyList(SqList *&L)
  {
     free(L);
  }

时间复杂度为O(1)。

(4)判断线性表是否为空

   bool ListEmpty(SqList *L)
 {
    return(L->length==0);
 }

时间复杂度为O(1)。

(5)求线性表的长度

    int ListLength(SqList *L)
  {
    return(L->length);
  }

时间复杂度为O(1)。

(6)输出线性表

     void DispList(SqList *L)
  {  

    int i;
    for (i=0;i<L->length;i++)
        printf("%d",L->data[i]);
    printf(" ");
  }

时间复杂度为O(L->length)。
(7)求线性表中的某个数据元素值(按位置查找)

    bool GetElem(SqList *L,int i,ElemType &e)
  {    if (i<1 || i>L->length) 

            return false;     //参数错误是返回false
       e=L->data[i-1];    //取元素值
       return true;   //成功找到元素时返回true
  }

时间复杂度为O(1)。

(8)按元素值查找(按值查找)

    int LocateElem(SqList *L, ElemType e)
  {    int i=0;
    while (i<L->length && L->data[i]!=e)

           i++;      //查找元素e
    if (i>=L->length)  return 0;    //未找到时返回0
    else 

         return i+1;     //找到后返回其逻辑序号
  }

时间复杂度为O(L->length)。
(9)插入数据元素

bool ListInsert(SqList *&L,int i,ElemType e)
{  int j;
   if (i<1 || i>L->length+1)
    return false;    //参数错误时返回false
   i--;            //将顺序表逻辑序号转化为物理序号
   for (j=L->length;j>i;j--)    //将data[i]元素后移一个位置
    L->data[j]=L->data[j-1];
   L->data[i]=e;            //插入元素e
   L->length++;            //顺序表长度增1
   return true;            //成功插入返回true
}

时间复杂度为O(n)。
(10)删除数据元素

bool ListDelete(SqList *&L,int i,ElemType &e)
{  int j;
   if (i<1 || i>L->length)     //参数错误时返回false
    return false;
   i--;        //将顺序表逻辑序号转化为物理序号
   e=L->data[i];
   for (j=i;j<L->length-1;j++)  //将data[i..n-1]元素前移
        L->data[j]=L->data[j+1];
   L->length--;              //顺序表长度减1
   return true;              //成功删除返回true
}
时间复杂度为O(n)。

原文地址:https://www.cnblogs.com/gly1120/p/7010912.html