线性表的存储结构主要有以下两类:
u定长的顺序存储结构——向量型的一维数组结构
•特点:线性表元素可以按地址相邻存储在数组的一片连续地址区域中。•缺陷:数组的固定长度限制了线性表长度变化不得超过该固定长度。
u变长的线性表存储结构——链接式存储结构、动态数组
•链接式存储结构:使用指针,按照线性表的前驱、后继关系将元素用指针链接。
•动态数组:既不限制长度,也不直接链接,而是为线性表的长度变化提供方法,当长度增加到一定量时,可以再申请一块较大的存储空间。
一般情况下,(a1,a2,…, ai-1,ai , …,an)的顺序存储:
Loc(ai)=Loc(a1) + (i-1)×d
随机存取:顺序存储结构中随机存取数据元素,代价:O(1)
Const int MAXSIZE=顺序表的容量;
typedef struct
{ datatype data[MAXSIZE];
int last;
} SeqList;
SeqList L ; 或 SeqList *L ;
空表:last =-1,表长:last+1,
初始化算法:
SeqList *init_SeqList ( )
{ SeqList *L;
L=malloc(sizeof(SeqList));
L->last=-1;
return L;
}
算法如下:
int Insert_SeqList(SeqList *L,int i,datatype x)
{ int j;
if (L->last==MAXSIZE-1)
{ printf("表满"); return(-1); } /*表空间已满,不能插入*/
if (i<1 || i>L->last+2) /*检查插入位置的正确性*/
{ printf("位置错");return(0); }
for(j=L->last;j>=i-1;j--)
L->data[j+1]=L->data[j]; /* 结点移动 */
L->data[i-1]=x; /*新元素插入*/
L->last++; /*last仍指向最后元素*/
return (1); /*插入成功,返回*/
}
删除算法如下:
int Delete_SeqList(SeqList *L;int i)
{ int j;
if (i<1 || i>L->last+1) /*检查空表及删除位置的合法性*/
{ printf ("不存在第i个元素");
return(0); }
for(j=i;j<=L->last;j++)
L->data[j-1]=L->data[j]; /*向上移动*/
L->last--;
return(1); /*删除成功*/
}