顺序表基本运算的实现:
1、顺序表是由data和length 两部分组成
typedef struct{
int *data; //相当于data[],data的首地址
int length;//线性表长度
}SqList;
2、创建一个空表:
总概:将数组a中的每一个元素依次放入顺序表中,并将n赋给顺序表的长度域(length)
void CreateList(SqList *&L,int a[],int n)
{
int i=0, k=0;
L=(SqList *)malloc(sizeof(SqList));//分配空间并转化为(SqList *)类型(保持类型的一致性)
while(i<n){
L->data[k]=a[i];
k++;i++;
}
L->length=k;
}
3、初始化线性表
void InitList(SqList* &L){
L=(SqList *)malloc(sizeof(SqList));
L->length=0; //置空为0即初始化
}
4、销毁线性表
void DestroyList(SqList* &L){
free(L); //当L不再指向线性表,即销毁
}
注:
a.L指的是SqList *的指针,指向名为SqList的结构体
b.当L不再指向线性表时,就意味着无法线性表无法再以其他方式被找到,想当于被销毁,但其实数据依然存在,只是不能再被找到了
5、判断((false or true)->bool)线性表是否为空
bool ListEmpty(SqList* L){
/*
if(L->length==0) return true;
else return false;
*/
return (L->length==0);
}
6、求线性表长度
int ListLength(SqList * L){
return L->length;
}
7、输出线性表
void DispList(SqList *L){
for(int i=0;i<L->length;i++){
cout<<L->data[i]<<endl;
}
}
8、求线性表中某个数据的元素值
bool GetElem(SqList *L,int i,int &e){
if(i<0||i>=L->length)
return false;
else{
e=L->data[i-1];
return true;
}
}
9、按元素查找(找与e相同的元素)
int LocateElem(SqList* L,int e){
int i=0;
while(i<L->length&&L->data[i]!=e)
i++;
if(i>=L->length)
return 0;
else return i+1;
}
对于线性表来说,要满足一对一的关系,即数据的存储是连续的,在插入元素时,要先后移,再插入,同样的,在删除元素时,也要讲后继元素依次前移。
10、插入数据元素
bool Listinsert(SqList *&L,int i,int e){
int j;
if(i<0||i>L->length)
return false;
else{
//也可在这里i--;将逻辑位序换位存储位序
for(j=L->length;j>=i;j--){
L->data[j]=L->data[j-1];
}
L->data[i-1]=e;
L->length++;
return true;
}
}
11、删除数据元素
bool ListDelete(SqList *&L,int i,int &e){//将删除元素取出放在e
int j=0;
if(i<0||i>L->length)
return false;
else {
i--; //将逻辑位序转化为存储位序
e=L->data[i];
for(j=i;j<L->length-1;j++){
L->data[j]=L->data[j+1];
}
L->length--;
return true;
}
关于SqList *&L与SqList* L;
对于创建,置空,销毁,插入和删除等,这些对线性表做出改动的操作,均用的是SqList *&L,定义为引用型变量,对于形参的操作,就是对实参的操作(形参与实参共用一个地址),而对于像判断线表是否为空,取值,输出等,只是读取线性表的数据,不对线性表做出改动,均用的SqList* L。
(蒟蒻的第二篇学习记录,有问题请指正,多谢🙏)