数据结构_顺序表

129 阅读2分钟

顺序表

顺序表:用顺序存储的方式实现线性表顺序存储

一.顺序表的实现

静态分配
typedef struct 

{

  ElemType data[MaxSize];  //用静态“数组”存放数据元素

  int length; //顺序表当前长度

}SqlList; //顺序表的定义类型(静态分配方式)
静态分配初始化:
 void InitList(SqlList &L){
  for (int i = 0; i < MaxSize; i++)
  {
​    L.data[i]=0; //所有元素设置为默认初始值

​    L.length=0;//初始长度设为0;
  }
}
动态分配
typedef struct 

{

  ElemType *data; //动态分配数组指针

  int Maxsize; //顺序表最大容量

  int length; //顺序表得当前长度

}SeqList;//顺序表的定义类型(动态分配方式)

动态申请空间:malloc

释放空间: free free(q)

动态分配初始化
void InitList(SeqList &L){

  L.data=(ElemType *)malloc(sizeof(ElemType)*MaxSize);

  L.length=0;

  L.Maxsize=MaxSize;

}

二.顺序表的特点

  1. 随机访问
  2. 存储密度高
  3. 拓展容量不方便 4.插入删除操作不方便,需要移动大量元素

三.顺序表插入(基于静态分配)

bool ListInsert(SqlList &L,int i,int e){
  if (i<1||i>L.length+1) return false; //判断i是否有效
  if (L.length>=MaxSize) return false; //判断存储空间是否已满
  for (int j= L.length;j>=i; j--)
  {
​    L.data[j] = L.data[j-1]; //将第i个元素之后的元素后移动
​    L.data[i-1]=e;
  }
​    L.length++;
  return true;  
}

时间复杂度:最好情况:O(1); 最坏情况:O(n); 平均情况:O(n)

四.顺序表删除第i个位置:位序i与数组下标i的区别

bool ListDelete(SqlList &L,int i,int &e){
  if (i<1||i>L.length+1) return false; //判断i是否有效
   e=L.data[i-1];  //被删除的元素给e
  for (int j= i;j<L.length; j++)
  {
​    L.data[j-1] = L.data[j]; //将第i个元素之后的元素前移动 
  }
​    L.length--;  //线性表长度减1
  return true;  
}

时间复杂度:最好情况:O(1); 最坏情况:O(n); 平均情况:O(n)

五.顺序表按位查找:时间复杂度O(1)

ElemType GetElem(SqlList L,int i){

  return L.data[i-1];

}

// 顺序表按值查找:时间复杂度最好情况:O(1); 最坏情况:O(n); 平均情况:O(n)

int LocateElem(SeqList L ,ElemType e){

  for (int i = 0; i < L.length; i++)

  {

​    if (L.data[i]==e) return i+1; 

  }

  return 0;  //查找失败

}

六.结构体比较:需要依次对比各个分量来判断是否相等