目录
1.地址的计算
假设线性表中n个元素,每个元素占k个单元,第i个元素地址为Loc()。
2.元素特点
1.地址连续
2.依次存放
3.随机存取
4.类型相同
3.顺序存储的表示
#define MAXSIZE 100
typedef char ElemType;
typedef struct{
ElemType *elem;
int length;
}SqList;
4.基本运算
4.1线性表的初始化
void InitList_Sq(SqList &L){ //构造一个空的顺序表
L.elem=new ElemType[MAXSIZE];
L.length=0;
}
4.2销毁线性表
void DestroyList(SqList &L) {
if(L.elem)
delete [] L.elem;
}
4.3清空线性表
void ClearList(SqList &L){
L.length=0;
}
4.4求线性表的长度
int GetLength(SqList L){
return (L.length);
}
4.5判断线性表是否为空
bool IsEmpty(SqList L){
if(L.length==0)
return true;
else
return false;
}
4.6顺序表的取值(根据位置i获取相应位置数据元素的内容) ,随机存取
ElemType GetElem(SqList L,int i,ElemType &e){
if(!(i<1||i>L.length))
e=L.elem[i-1];
return e;
}
4.7顺序表的查找(按值查找)
int LocateElem(SqList L,ElemType e){//在表中查找元素e
for(int i=0;i<L.length;i++)
if(L.elem[i]==e)
return i+1;
}
4.8插入元素
#define OK 1
#define ERROR 0
int ListInsert(SqList &L,int i,ElemType e){ //在表中第i个位置插入元素e
if((i<1)||(i>L.length+1)) //i值不合法
return ERROR;
if(i>MAXSIZE) //当前存储空间已满
return ERROR;
for(int j=L.length-1;j>=i-1;j--)
L.elem[j+1]=L.elem[j]; //插入位置及之后的元素后移
L.elem[i-1]=e;
L.length++; //表长加一
return OK;
}
算法分析:E为长度为n的表中插入一元素所需移动元素的平均次数,原有n个元素,则新插入元素可插入的位置有n+1个,假设在任何位置上插入的概率相等,即
插入位置 | 原有元素需移动的次数 |
n+1 | 0 |
n | 1 |
... | ... |
1 | n |
所以,T(n)=O(n)
4.9删除元素
void ListDelete(SqList &L,int i) {
if((i<1)||(i>L.length))
cout<<"删除位置不合法"<<endl;
else
for(int j=i;j<=L.length-1;j++)
L.elem[j-1]=L.elem[j];
L.length--;
}
算法分析:E为删除一元素所需移动元素的平均次数,可删元素有n个,为删除第i个元素的概率,并假设在任何位置上删除的概率相等,即
删除位置 | 原有元素需移动的次数 |
n | 0 |
n-1 | 1 |
... | ... |
1 | n-1 |
所以,T(n)=O(n)
4.10有序表的合并
void MergeList(SqList La,SqList Lb,SqList &Lc){
ElemType *pa,*pb,*pc,*pa_last,*pb_last;
pa=La.elem;
pb=Lb.elem; //指针pa,pb的初值分别指向两个表的第一个元素
Lc.length=La.length+Lb.length;
Lc.elem=new ElemType[Lc.length] ;//为新表分配一个数组空间
pc=Lc.elem;
pa_last=pa+La.length-1;//指向la表的最后一个元素
pb_last=pb+Lb.length-1;
while (pa<=pa_last&&pb<=pb_last)
if(*pa<=*pb)
*pc++=*pa++;
else
*pc++=*pb++;
while(pa<=pa_last)//LB表已到达表尾,将LA中剩余元素加入LC
*pc++=*pa++;
while(pb<=pb_last)//LA表已到达表尾,将LB中剩余元素加入LC
*pc++=*pb++;
}
5.优缺点
优点: 1.存储密度大,无须为表示结点间的逻辑关系而增加额外的存储空间(存储密度=结点本身所占存储量/结点结构所占存储量)
2.可随机存取表中任一元素。
缺点:1.在插入、删除某一元素时,需移动大量的元素。
2.可能造成存储空间的浪费。(预先分配的表空间较大)
3.属于静态存储形式,数据元素的个数不能自由扩充。