提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
概念
具有相同数据类型的n个数据元素的有限序列。n表示表长,n=0时为空表。
线性表存储分类:顺序表(用一维数组实现定长的线性存储结构)和链表(用指针实现变长的线性存储结构)【单链表,双链表,循环链表】
顺序表
假定线性表夫人元素类型为ElemType,则线性表的顺序存储类型描述为:
#define MaxSize 50//定义线性表的最大长度
typedef struct
{
ElemType data[MaxSize];//顺序表的元素
int length;//顺序表的当前长度
}sqList;//顺序表的类型定义
遍历
if(length==0)cout<<"empty"<<endl;
else
{
cout<<"output elements:\n";
for(int i=0;i<length;i++)//依次访问元素
cout<<data[i]<<" ";
cout<<endl;
}
时间复杂度为O(n),空间复杂度O(1)
查找
思想:遍历线性表,
for(int i=0;i<length;i++)
if(value==data[i])
return i;
return -1;
时间复杂度O(n),空间复杂度O(1)
插入
if(i<0||i>length)//合法的位置插入
throw outOfRange();
if(length==maxSize)//表满,扩大表或报错
resize();
for(int j=length;j>i;j--)//元素后移一位
data[j]=data[j-1];
data[i]=value;//将value置入i的位置
++length;//表的实际长度增加1
时间复杂度O(n),空间复杂度O(1)
平均移动数据元素次数(期望值):n/2
删除
if(i<0||i>length-1)//合法的删除位置
throw outOfRange();
for(int j=i;j<length-1;j++)//元素前一一位
data[j]=data[j+1];
--length;//表的实际长度减1 ,实际元素个数减少了
时间复杂度O(n),空间复杂度O(1)
平均移动数据元素的次数(期望值):(n-1)/2
逆置
for(int i=0;i<length/2;i++)
{
tmp=data[i];
data[i]=data[length-i-1];
data[length-i-1]=tmp;
}
时间复杂度O(n),空间复杂度O(1)
顺序表特点
- 顺序表需要预先分配存储空间,很难恰当预留空间。
- 逻辑次序和物理次序一致性,能按序号(下标)直接存取元素,具有随机存取的优点
- 顺序表在插入删除时需要移动大量的数据,因此其插入和删除效率低。
- 难于改变顺序表的大小,需要重新创建新的顺序表,把原表里的数据复制到新表,然后释放原表空间。
- 顺序表比较适合静态的,经常做定位访问的线性表。