遍历线性表中的所有元素。
ADT List {
数据对象: D={ai|ai∈ElemSet,i=1,2,...,n,n≥0}
数据关系: R={<ai-1,ai>|ai-1,ai∈D,i=2,...,n}
基本操作:InitList(&L)、DestroyList(&L)、ClearList(&L) 、ListEmpty(L)、ListLength(L)、GetElem(L,i,&e)、LocateElem(L,e)、PriorElem(L,cur_e,&pre_e)、NextElem(L,cur_e,&next_e)、ListInsert(&L,i,e)、ListDelete(&L,i,&e)、TraverseList (L)
}ADT List
一个一维数组M,下标的范围是0到9,每个数组元素用5个字节存储。存储器按字节编址,设存储数组元素M[0]的第一个字节的地址是98,则M[3]的第一个字节的地址是_113___.
解:地址计算通式为:LOC(ai) = LOC(a1) + L *(i-1)因此:LOC( M3 ) = 98 + 5 ×(4-1) =113
用一维数组来表示顺序表:
typedef int ElemType; //定义ElemType类型为int
# define MAXSIZE 100 // 顺序表的最大长度
typedef struct { //若后面不再用,可省略结构名
ElemType *elem; //存储空间的基地址
int length; //当前表长
}SqList; //顺序表的类型名
线性表的顺序操作:
int *data=new int[1000];
Status InitList(SqList &L)
{ //构造一个空的顺序表L。
L.elem = new ElemType[MAXSIZE];
L.length = 0; // 空表长度为0
return OK;
}
n2. 销毁顺序表
void DestroyList(SqList &L)
{
if (L.elem) delete[ ] L.elem; //释放存储空间
L.length=0;
L.elem=NULL;
}
n3. 清空顺序表
void ClearList(SqList &L)
{
L.length=0; //将顺序表的长度置0
}
n4. 求顺序表的长度
int ListLength(SqList L)
{
return L.length;
}
bool ListEmpty(SqList L)
{
if (L.length==0)
return true;
else
return false;
}
bool ListEmpty(SqList L)
{
return L.length==0;
}
Status GetElem(SqList L,int i,ElemType &e)
{
//判断i值是否合理,若不合理,返回ERROR
if (i<1||i>L.length) return ERROR;
e=L.elem[i-1]; //第i-1个单元存储第i个数据
return OK;
}
算法的时间复杂度为O(1)
int LocateElem(SqList L,ElemType e)
{
for (i=0;i< L.length;i++)
if (L.elem[i]==e) return i+1;
return 0;
}
Status ListInsert(SqList &L,int i ,ElemType e){
if(i<1 || i>L.length+1) return ERROR; //i值不合法
if(L.length==MAXSIZE) return ERROR;
//当前存储空间已满
for( j=L.length-1; j>=i-1 ; j--)
L.elem[ j+1]=L.elem[ j]; //插入位置及之后的元素后移
L.elem[i-1]=e; //将新元素e放入第i个位置
++L.length; //表长增1
return OK;
}
n9. 删除顺序表的第i个数据元素(当删除第i个元素时,需要移动 n-i 个元素)
Status ListDelete(SqList &L,int i, ElemType &e){
if(i<1||i>L.length) return ERROR; //i值不合法
e=L.elem[i-1];
for ( j=i;j<=L.length-1;j++)
L.elem[ j-1 ]=L.elem[ j ]; //被删除元素之后的元素前移
--L.length; //表长减1
return OK;
}
由此可见,在顺序存储表示的线性表中插入或删除一个数据元素,平均约需移动表中一半元素。
顺序表的优缺点: