线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素,使得线性表中在逻辑结构上相邻的数据元素存储在连续的物理存储单元中,即通过数据元素物理存储的连续性来反映数据元素之间逻辑上的相邻关系。采用顺序存储结构存储的线性表通常简称为顺序表。可将顺序表归纳为:关系线性化,结点顺序存。
用C语言定义线性表的顺序存储结构如下:
#include<bits/stdc++.h>
#define MAXSIZE 100 /*线性表的最大长度 */
#define OK 1
#define ERROR 0
using namespace std;
typedef char ElemType;
typedef struct{
ElemType elem[MAXSIZE];/*线性表占用的数组空间*/
int last;/*记录线性表中最后一个元素在数组elem[]中的位置(下标值),空表置为-1*/
} SeqList;
顺序表初始化:
void InitList(SeqList *L){
L=(SeqList*)malloc(sizeof(SeqList));
L->last = -1;
}
创建顺序表:
void CreatSeqList(SeqList *L){
int len;
cout<<"请输入顺序表的长度\n";
cin>>len;
cout<<"请输入元素\n";
for(int i = 0; i < len; i++){
cin>>L->elem[i];
L->last++;
}
}
顺序表的按内容查找运算:
int Locate(SeqList L, ElemType e){
/*L中查找与e相等的元素*/
int i = 0;
while((i <= L.last) && (L.elem[i] != 0))
i++;
if(i <= L.last)
return i+1;/*找到值为e的元素,则返回其序号*/
else
return -1;/*若没找到,则返回空序号*/
}
顺序表的插入运算:
int InsList(SeqList *L, int i, ElemType e){
int k;
if((i < 1) || (i > L->last+2)){/*判断插入位置是否合法*/
cout<<"插入位置i值不合法\n";
return ERROR;
}
if(L->last >= MAXSIZE-1){
cout<<"表已满,无法插入\n";
return ERROR;
}
for(k = L->last; k >= i-1; k--)/*为插入元素而移动位置*/
L->elem[k+1] = L->elem[k];
L->elem[i-1] = e;/*第i个元素的下标为i-1*/
L->last++;
return OK;
}
顺序表的删除运算:
int DelList(SeqList *L, int i,ElemType *e){
int k=0;
if((i < 1) || (i > L->last+2)){
cout<<"删除位置i值不合法\n";
return ERROR;
}
*e = L->elem[i-1];/*将删除的元素存放到e所指向的变量中*/
for(k = i; k <= L->last; k++)
L->elem[k-1] = L->elem[k];/*将后面的元素依次前移*/
L->last--;
return OK;
}
打印顺序表:
void PrintSeqList(SeqList L){
for(int i = 0; i < L.last; i++)
cout<<L.elem[i];
cout<<"\n";
}
测试主函数:
int main(){
SeqList L;
ElemType e, ch;
InitList(&L);
CreatSeqList(&L);
Locate(L, 'b');
InsList(&L, 3, '#');
cout<<"插入结果如下:\n";
PrintSeqList(L);
DelList(&L, 4, &e);
cout<<"删除结果如下:\n";
PrintSeqList(L);
}
运行结果:
线性表顺序存储表示的优点如下:
- 无须为表示结点间的逻辑关系而增加额外的存储空间(因为逻辑上相邻的元素其存储的物理位置也是相邻的)。
- 可方便地随机存取表中的任一元素,如GetData(L, i)操作。
线性表顺序存储表示的缺点如下:
- 插入或删除运算不方便,除表尾的位置外,在表的其他位置上进行插入或删除操作都必须移动大量的结点,其效率较低。
- 由于顺序表要求占用连续的存储空间,存储分配只能预先进行静态分配。因此当表长变化较大时,难以确定合适的存储规模。若按可能达到的最大长度预先分配表空间,则可能造成一部分空间长期闲置而得不到充分利用;若事先对表长估计不足,则插入操作可能使表长超过预先分配的空间而造成溢出。