线性表特点:除第一个元素无直接前驱,最后一个元素无直接后继之外,其他每个数据元素都有一个前驱和一个后继。
同一线性表中元素必定具有相同特性
2.1 线性表的顺序表示与实现
2.1.1线性表的顺序表示
线性表的顺序表示是用一组地址连续的存储单元依次存储线性表的数据元素。
特点:逻辑上相邻,物理上也相邻
假设线性表中每个元素需要占用L个存储单元,并以所占第一个单元的存储地址作为数据的存储起始位置,则线性表i+1个数据元素的存储位置Loc(ai+1)和第i个数据的存储位置Loc(ai)之间满足以下关系:
Loc(ai+1)=Loc(ai)+L
Loc(ai)=Loc(a1)+(i-1)*L
//------顺序表的存储结构--------
#define MAXSIZE 100 //顺序表可能达到的最大长度
typedef struct
{
ElemType *elem; //存储空间基地址
int Length; //当前长度
}SqList; //顺序表的结构类型为SqList
2.1.2顺序表中基本操作实现
1.初始化
顺序表的初始化就是构造一个空的顺序表
【算法步骤】
1.为顺序表动态分配一个预定义大小的数组空间,使elem指向这段空间的基地址
2.将表的当前长度设为0
Status InitList(SqList &L)
{
L.elem=new ElemType[MAXSIZE];
if(!L.elem) exit (OVERFLOW);
L.Length=0;
return OK;
}
2.取值
取值是根据指定位置序号i,获取顺序表中第i个数据元素的值
由于顺序存储结构具有随机存取的特点,可以直接通过数组下标定位得到,elem[i-1]单元存储第i个数据元素
【算法步骤】
1.判断指定的位置序号是否合理,(i<=i<=L.length),若不满足则返回ERROR
2.若i值合理,则将第i 个数据元素L.elem[i-1]赋值给参数e,通过e 返回第i个数据元素的值
Status GetElem (SqList L ,int i,ElemType &e)
{
if ((i<1)||(i>L.Length)) return ERROR;
e=L.elem[i-1];
return ok;
}
3.查找
根据指定的元素e,查找顺序表中第1个值与e相等的元素。若查找成功,则返回该元素在表中位置序号,若查找失败,则返回0.
【算法步骤】
1.从第一个元素起依次将其值和e相比较,若找到值与e相等的元素L.elem[i],则查找成功,返回该元素的序号i+1。
2.若查找整个顺序表都没有找到,则查找失败,返回0。
int LocateElem (SqList L,ElemType e)
{
for(i=0;i<L.Length;i++)
if(L.elem[i]==e) return i+1;
return 0;
}
4.插入
一般情况下,在第i(1<=i<=n)个位置插入一个元素时,需要从左后一个元素即第n个元素开始,依次向后移动一个位置,直到第i个元素(共n-i+1个元素)
【算法步骤】
1.判断插入位置i是否合法,(i值合法范围是1<=i<=n+1),若不合法则返回ERROR
2.判断顺序表存储空间是否已满,若满则返回ERROR
3.将第n个至第i个位置的元素依次向后移动一个位置,空出第i位置(i=n+1时无需移动)
4.将插入的元素e放在第i个位置
5.表长加一
【算法描述】
Status ListInsert (SqList &L,int i,ElemType e)
{
if((i<1)||(i>L.Length+1)) return ERROR;
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;
++L.Length;
return OK;
}
5.删除
线性表的删除是指将表中第i个元素删除,将长度为n的线性表,变成长度为n-1的线性表
一般情况下:删除第i(1<=i<=n)个元素时需将第i+1至第n个元素(共n-i个元素)依次向前移动一个位置(i=n时无须移动)
【算法步骤】
1.判断删除位置i是否合法(合法值为1<=i<=n),若位置不合法则返回ERROR.
2.将第i+1个元素至第n个元素依次向前移动一个位置(i=n时无须移动)
3.表长减一
Status ListDelete (SqList &L,int i)
{
if((i<1)||(i>L.Length)) return ERROR;
for(j=i;j<=L.Length-1;j++)
L.elem[j-1]=L.elem[j];
--L.Length;
return OK;
}