【数据结构】新手入门——线性表(1)
一、顺序表
线性表的顺序表示,指的是用一组地址连续的存储单元依次存储线性表的数据元素。
存储地址 | 数据元素 |
---|---|
b | 1 |
b+L | 2 |
… | … |
b+(i-1)*L | i |
b+i*L | i+1 |
– | – |
类于此表,每个元素占用 L 个存储单元,在某个元素所对应的下一个元素的的地址即为该元素所对应地址加 L 的值。
p(i+1)=p(i)+L
第n个元素所对应地址p(n)
p(n)=p(1)+(n-1)*L
下面,如何构建一个顺序表?
(1)定义一个结构体
typedef struct{
elemtype *elme;//elemtype为元素类型
int length;
int listsize;
}SqList;
a) elem为线性表的基址;
b) length指示线性表的当前程度;
c) listsize表示的是当前分配存储空间的大小;
(2)创建一个空的顺序表
Status InitList Sq(SqList &L)
{
L.elme=(ElemType *)malloc(ListInitSize*sizeof(ElemType));
if(!L.elme) exit(OVERFLOW);//存储分配失败
L.length=0;//空表长度为0
L.listsize=ListInitSize;//初始存储容量
return 1;
}
a) Status表示的是状态,即返回值类型;
b) ListInitSize为自定义的值,在函数头定义,定义格式如下:
#define ListInitSize 100
(3)向空表中插入元素
Status ListInsert(SqList &L,int i,ElemType e)
{
if(i<1||i>L.length) return 0;//i值不合法
if(L.length>=listsize{//改顺序表已满
newbase=(ElemType *)realloc(L.elem,(L.listsize+ListInitSize)*sizeof(ElemType));//分配新的空间
if(!newbase) exit(OVERFLOW);//分配失败
L.elem=newbase//新基址
L.listsize+=ListInitSize;
}
q=&(L.elem[i-1]);
for(p=&(L.elem[L.length]-1);p>=q;--p)
*(p+1)=*p;
*q=e;//插入元素
++L.length;//表长+1
return 1;
}
(4)删除顺序表中的元素
Status DelateSq(SqList &L,int i,ElemType e)
{
if(i<1||i>L.Length) return 0;
p=&(L.elem[i-1]);//定位元素地址
e=*p;
q=L.elem+L.length-1;
for(++p;p<=q;++p) *(p-1)=*p;
--L.length;
return 1;
}