线性表的顺序存储又称顺序表。她是用一组连续的存储单元,依次存储线性表中的数据元素,从而使得在逻辑上相邻的元素在物理位置上也相邻。
顺序表的基本操作。
//顺序表的存储类型描述
#define MAXSIZE 50
typedef int ElemType;
typedef struct{
ElemType data[MAXSIZE];
int length;
int maxSize;
}SqList;
//初始化顺序表
void init(SqList &L){
L.length = 0;
L.maxSize = MAXSIZE;
}
//因为要多次输出以查看结果,为增加程序的可读性用一个函数来表示输出
void print(SqList &L){
int i=0;
for(i=0;i<L.length;i++){
printf("%d ",L.data[i]);
}
printf("\n");
}
bool ListInsert(SqList &L,int i,ElemType e){//在线性表的i位置上插入元素e
if(i<1||i>L.length+1) return false;//因为插入的位置是可以为第一位置和最后一个位置之间的任何位置,如果不在这一范围内则非法
if(L.length+1 > L.maxSize) return false;//表的长度也不能大于最大长度
for(int j=L.length;j>=i;j--)L.data[j] = L.data[j-1];//插入元素所在位置后的所有元素后移一位
L.data[i-1] = e;//在i位置上插入e,这里为i-1是因为L.data[]是一个数组,下标从1开始。
return true;
}
注:需要指出的是,线性表中的元素的位序(相当于数组的下标)从1开始
bool listDelete(SqList &L,int i ,ElemType &e){//删除线性表 中第i个元素
if(i<1||i>L.length)
return false;
e=L.data[i-1];
for(int j=i;j<L.length;j++){
L.data[j-1]=L.data[j];
}
L.length--;
return true;
}
int ListLocated(SqList &L,ElemType e){
int i=0;
for(i=0;i<L.length;i++){
if(L.data[i]==e){
printf("%d",i+1);
return i+1;
}
}
return 0;
}
//查找整个顺序表,查找最小的元素并记住其位置,搜素结束后用最后一个元素填补原最小值的位置
bool Del_min(SqList &L,ElemType &value){
int i=0;
int pos=0;
if(L.length==0)
return false;
value=L.data[0];//假设第一个元素是最小值
for(i=0;i<L.length;i++){
if(L.data[i]<value)
value=L.data[i];
pos=i;
}
L.data[pos]=L.data[L.length-1];
L.length--;
return false;
}
//逆置顺序表
void Reverse(SqList &L){
int i=0;
int temp=0;//辅助变量
//遍历表的前半部分
for(i=0;i<(L.length)/2;i++){
temp=L.data[i];
L.data[i]=L.data[L.length-i-1];
L.data[L.length-i-1]=temp;
}
}
//删除表中所有值为e得值
void Del_value_x1(SqList &L,ElemType e){
int i=0;
int k=0;
for(i=0;i<L.length;i++){
if(L.data[i]!=e){
L.data[k]=L.data[i];
k++;
}
}
L.length=k;
}
//删除表中所有值为e的值
void Del_value_x2(SqList &L,ElemType e){
int i=0;
int k=0;
for(i=0;i<L.length;i++){
if(L.data[i]==e){
k++;
}else{
L.data[i-k]=L.data[i];
}
}
L.length-=k;
//printf("%d",k);
}