线性表的顺序存储又称顺序表。
一组地址连续存放的存储单元依次存放线性表的元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。
数组静态分配
#define MaxSize 50
typeof struct{
Element date[MaxSize ];
int length;
}SqList;
数组动态分配
#define MaxSize 50
typeof struct{
Element *date;
int length;
}SqList;
动态分配语句
C L.data = (Elemtype*)malloc(sizeof(Elemtype)*InitSize);
C++ L.data = new ElemType[InitSize];
顺序表的定义
插入操作:
/**
* SqList &L引用类型顺序表L
* int i 开始插入的位置(使用前插法,对应的不是数组下标)
* Elemtype e 要插入的数据
*/
bool ListInsert(SqList &L,int i,Elemtype e){
if(i<1 || i>L.length+1){
return false;
}
if(L.length>=MaxSize){
return false;
}
for(int j=L.length;j>=i;j--){
L.data[j]=L.data[j-1];
}
L.data[i-1]=e;
L.length++;
return true;
}
// L.date总长度为7,并且前面五个数据空间已经存储了“a,b,c,d,e”这五个数据
ListInsert[L,3,'e'];
最好情况:表尾插入i=n+1 ,不执行语句 O(1)
最坏情况:表头插入i=1 ,n 条语句执行O(n)
平均情况:插入一个结点的概率,p=i/(n+1) 平均移动次数 n/2. O(n)
删除操作:
/**
* SqList &L 引用类型顺序表L
* int i 要删除的位置(对应的不是数组下标)
* Elemtype &e 要删除数据的引用变量
*/
bool ListDelete(SqList &L,int i,Elemtype &e){
if(i<1||i>l.length){
return false;
}
e=L.data[i-1];
for(int j=i;j>L.length;j++){
L.data[j-1]=L.data[j];
}
L.length--;
return true;
}
// L.date总长度为7,并且前面五个数据空间已经存储了“a,b,c,d,e”这五个数据
ListInsert[L,3,e];
最好情况:表尾删除i ,不移动 O(1)
最坏情况:表头删除,需要移动n-1个元素,时间复杂度O(n)
平均情况:删除一个结点的概率,p=1/n 移动次数 n-i 平均移动次数 n-1/2. O(n)
按值查找:
/**
* SqList L 需要查找的顺序表
* Elemtype e 要查找的数据
*/
int LocateElem(SqList L,ElemType e){
int i;
for(i=0;i<L.length;i++){
if(L.data[i]==e){
return i+1;
}
}
return 0;
}
最好情况:表头i ,执行一次 O(1)
最坏情况:表尾,需要比较n个元素,时间复杂度O(n)
平均情况:查找一个结点的概率,p=1/n 查找次数 i 平均查找次数 n+1/2. O(n)