<!--author--Kang-->
<!--time--2020/7/26-->
用一组连续的存储单元一次存储线性表的数据元素,通常这种存储结构为线性表的顺序表(Sequential List)。特点时逻辑上相邻的数据元素再物理次序上也是相邻的
a[i]的地址计算(偏移量):数组首地址+i*每个元素大小
是在计算机内存中以数组的形式保存的线性表,是用一组地址连续的存储单元依次存储相同数据类型的数据元素的线性结构。
把学号为 1 的学生存放在数组下标为 0 的位置中,接着依次存储即可。所以为了创建一个顺序表,必须要在内存中开辟一块空间,那么第一个数据元素的首地址就变得非常关键;
此外,既然顺序表是容器,那么容器的容量一定要确定,就是最多允许存放多少个数据元素,而数组的长度就是这个容器的最大容量。
另外对于当前容器中已经存放了多少个数据元素也是很重要的。
根据上面的分析,我们发现顺序表有三个必须的属性:
1)实现机制:运用数组来存放数据元素,数组的首地址就是线性表的首地址。
2)最大容量:数组的长度。
3)线性表长度:数组中已经存放的数据元素的个数。
根据这些信息,我们可以定义出线性表的顺序存储的结构体类型了:
注意:
//typedef int ElementType; 中ElementType为数据元素类型,当元素类型为结构体类型时,也适用
首先时初始化操作,初始化的目的时要将顺序表准备好,以便后续的其他操作,因此一般会在定义了顺序表后调用一次。
使用静态数组实现的顺序表的初始化:由于数组已经定义完成,而对于顺序表的操作基本思都依赖于其商都,所以只需要在初始化时将长度赋为0即可,甚至于直接在定义该顺序表时直接初始化即可:
//初始化函数:
int init_list(SEQ_LIST *L){
L->length = 0;
return 1;
}
//或者定义顺序表时直接初始化化:
SEQ_LIST list = {0};
使用动态分配内存的方式实现的顺序表的初始化:在函数中完成内存分配和清空操作
int init_list(SEQ_LIST *L){
L->data = (ElementType *) malloc(sizeof(ElementType) * MAX_SIZE);
if(L->data == null)//内存可能会分配失败
{
return 0;
}
L->length = 0;
return 1;
}
注意:对于动态分配内存的方式实现的顺序表,最好还需要补充一个操作,即销毁线性表的操作,用来释放程序中申请到的内存空间。
int gei_length(SEQ_LIST L){
return L.length;
}
int is_empty(SEQ_LIST L){
return L.length == 0;
}
void show(SEQ_LIST *L){
for(int j = 0;j<L-length;j++){
printf("%d",L-data[j]);//这里以数组元素为int类型为例,若不是基本类型,需要在这里修改输出内容
if(j<L-length-1){// 为了美观,这里对于前面的数据输出时加一个逗号
printf(",");
}else{//最后一个符号用回车符
printf("\n");
}
}
}
步骤:
1)判断顺序表是否已满,如果满了,操作失败;
2)判断插入位置是否合理,不合理则操作失败;
3)从最后一个数据元素开始向前遍历到第index位置,分别将它们依次向后移动一位;
4)将要插入的元素填入第index位置处;
5)顺序表长度+1;
//插入操作:
int insert(SEQ_LIST *L, int i, ElementType e){//传指针,把e插入到顺序表第i个位置,i为下标,实际上要减一处理,
//1)判断顺序表是否已满,如果满了,操作失败;
if (L->length == MAX_SIZE) {
return 0;//0表示失败
}
//2)判断插入位置是否合理,不合理则操作失败;
if (i<1||i>L->length+1)//合理位置:1<=index<=MAX_SIZE
{
return 0;//0表示失败
}
//3)从最后一个数据元素开始向前遍历到第index位置,分别将它们依次向后移动一位;
for (int j =L->length-1;j>=i-1; j--)
{
L->data[j + 1] = L->data[j];//将下标为j的元素赋值给下标为j+1的元素,完成元素后移一位操作
}
//4)将要插入的元素填入第index位置处;
L->data[i - 1] = e;//将元素e插入到第i个位置(i-1);
//5)顺序表长度 + 1;
L->length++;
return 1;
}
?
int main() {
SEQ_LIST list;
init_list(&list);
/*int rlt = insert(&list,2,1);
printf("%d\n", rlt);*///输出为0,说明失败,因为顺序表需要按顺序插入,第一个位置没有插入数据,直接插入第二个位置会失败
insert(&list, 1, 1);
insert(&list, 2, 7);
insert(&list, 3, 2);
insert(&list, 4, 8);
insert(&list, 5, 9);
insert(&list, 6, 6);
insert(&list, 7, 2);
insert(&list, 8, 8);
insert(&list, 9, 5);
insert(&list, 10, 0);
show(&list);//输出:1,7,2,8,9,6,2,8,5,0
printf("=======================\n");
//插入已有元素位置
insert(&list, 1, 0);
insert(&list, 10, 1);//此时数组长度为11位,前面插入了元素0,再从新数组第十个位置上再插入元素1
show(