目录
2.4 线性表顺序表示和实现
2.4.1 线性表的顺序存储表示
1.顺序存储定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。
2.顺序存储占用一片连续的存储空间,有空的存储单元的话则不是顺序存储结构。
3.所以知道i个元素的存储位置,则可以知道i+1元素的位置。
LOC(ai)+(maxlen-1)×l
特点:以物理位置相邻表示逻辑关系。任一元素均可随机存取。(优点)
#define LIST_INT_SIZE 100
typedef struct{
ElemType elem[LIST_INT_SIZE];
int length;
}SqList;
// 多项式的顺序存储结构类型定义
#define MAXSIZE 1000 // 多项式可能达到的最大长度
typedef struct{ // 多项式非零项的定义
float p; // 系数
int e; // 指数
}Polynomial;
typedef struct{
Polynomial *elem; // 存储空间的基地址
int length; // 多项式中当前项的个数
}SqList; // 多项式的顺序存储结构类型为SqList
void GetLength(SqList L) // 获取L的长度
{
return (L.length);
}
int GetElem(SqList L, int i, ElemType &e) //顺序表的取值
{
if(i<1 || i>L.length)
return ERROR; // 判断i值是否合理,若不合理,返回ERROR
e = L.length[i-1]; // 第i-1个单元存储着第i个数据
return 1;
}
2.4.2 顺序表基本操作的实现
基本操作:
顺序表的查找操作:
1.按值查找
e.g.顺序表的查找
int LocateElem(SqList ElemType e)
//在线性表L中查找值为e的数据元素,返回其序号(是第几个元素)
{
for(i=0; i<L.length; i++)
if(L.length[i] == e)
return i+1; //查找成功,返回序号
return 0; //查找失败,返回0
}
平均查找长度ASL:为确定记录在表中的位置,需要与给定值进行比较的关键字的个数的期望值叫做查找算法的平均查找长度。
顺序表的插入:
1.插入位置可在最后、中间、最前。
2.算法思想:
Status ListInsert_Sq(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;
}
顺序表的删除:
1.删除位置可在最后、中间、最前。
2.算法思想:
Status ListDelete_Sq(SqList &L, int i, ElemType e)
{
if(i<1 || i>L.length + 1)
return ERROR; //i值不合法
for(j=i; j<=L.length-1; j++)
L.elem[j-1] = L.elem[j]; //被删除元素之后的元素前移
L.length--; //表长-1
return OK;
}