1.线性结构的定义
如果⼀个数据元素序列满⾜:
1. 除第⼀个和最后⼀个数据元素外,每个数据元素只有⼀个前驱数据元素和⼀个后继数据元素;
2. 第⼀个数据元素没有前驱数据元素;
3. 最后⼀个数据元素没有后继数据元素;
我们称这样的结构就叫做 线性结构
线性结构包括:
线性表、链表、栈、队列...... 其中,最典型、最常用的是线性表。
线性表抽象数据类型主要包括两个⽅⾯:既数据集合和该数据集合上的操作集合。
⑴线性表的基本操作根据实际应用而定;
⑵复杂的操作可以通过基本操作的组合来实现;
⑶对不同的应用,操作的接口可能不同。
2.顺序表
在计算机内存中,顺序表是以数组的形式保存的线性表。也就是⼀组地址连续的存储单元依次存储 数据元素的线性结构。 在数组中,我们会先申请⼀段连续的内存空间,然后把数组以此存⼊内存当中,中间没有⼀点空隙。这就是⼀种顺序表存储数据的⽅式。对于顺序表的基本操作有:增(add),删(remove),改 (set),查(find),插(insert)。
1.静态顺序表的结点结构
使用定长数组存储元素 缺陷:给小了不够用,给大了可能浪费,本文代码不以它为例
#define N 10
typedef struct Array{
int date[N];//指针模拟开数组
int length;//理论最大容量
int size;//实际容量
}MyArray;
2.动态顺序表的结点结构
//实现一个存放int类型数据的顺序表
typedef struct ArrayList{
int *date;//指针模拟开数组
int length;//理论最大容量
int size;//实际容量
}MyArray;
3.初始化顺序表
//初始化顺序表,将顺序表的 理论最大容量定为n
MyArray initAarry(int n)
{
MyArray ar;
ar.date=(int *)malloc(sizeof(int)*n);
if(ar.date==NULL)
{
printf("空间分配失败\n");
}
ar.length=n;
ar.size=0;
return ar;
}
4.顺序表插入操作(尾插)
//在顺序表a中增加一个元素k
void add(MyArray *a,int k)
{
if(a->size<a->length)
{
a->date[a->size]=k;
a->size++;
}
else{
printf("空间已满,不能插入\n");
}
}
如果头插的话,用循环依次将元素往后挪就行了
5.顺序表指定位置插入
//在顺序表a的i下标位置,插入一个元素k
void insert(MyArray *a,int i,int k)
{
if(a->size<a->length)
{
//移动位置
for(int j=a->size-1;j>=i;j--)
{
a->date[j+1]=a->date[j];
}
a->date[i]=k;
a->size++;
}
else{
printf("空间已满,不能插入\n");
}
}
6.顺序表中查找元素
int find(MyArray *a,int k)
{
for(int i=0;i<a->size;i++)
{
if(a->date[i]==k)
{
return i;
}
}
return -1; //未找到
}
7.顺序表删除操作
//在顺序表a中删除元素k
void del(MyArray *a,int k)
{
int i=find(a,k);//i是被删除数据k的下标
if(i==-1)
{
printf("被删除的数据不存在\n");
}
else
{
for(int j=i+1;j<a->size;j++)
{
a->date[j-1]=a->date[j];
}
a->size--;
}
}
8.更改顺序表中元素
void change(MyArray *a,int k,int x)
{
int i = find(a,k);
if(i!=-1)
{
a->date[i]=x;
}
}
3.总结
1.优势
因为数据在数组中按顺序存储,可以通过数组下标直接访问,因此顺序表的查找定位元素很快。
2.劣势
插⼊和删除元素都需要⼤量的操作。 因为数组在声明的时候需要确定⻓度,因此顺序表的⻓度是确定的。若需要扩⼤顺序表⻓度,有需要大量的操作,不够灵活。(要将该数组中的元素全部copy到另外⼀个数组)由于数据⼤⼩的不可测性,有时会浪费掉⼤量的空间。
3.应⽤场景
总之,顺序表适⽤于那些不需要对于数据进⾏⼤量改动的结构。
4.顺序表的效率分析
顺序表对于插⼊、删除⼀个元素的时间复杂度是O(n)。 因为顺序表⽀持随机访问,顺序表读取⼀个元素的时间复杂度为O(1)。因为我们是通过下标访问的,所以时间复杂度是固定的,和问题的规模⽆关。 最大的优点是空间利⽤率⾼。最⼤的缺点是大小固定。