数据结构:线性表的顺序存储详解
创作时间:
作者:
@小白创作中心
数据结构:线性表的顺序存储详解
引用
CSDN
1.
https://m.blog.csdn.net/ccf3699f/article/details/145172942
线性表是数据结构中的基本概念,而顺序存储结构是实现线性表的一种常见方式。本文将详细介绍线性表的顺序存储结构的特点,并通过C语言代码示例展示其具体实现。
线性表
线性表是由n个任意类型的数据元素组成的有限序列。
顺序存储:顺序存储结构是用一段连续的存储单元依次存储线性表中的数据元素。
特点:
- 物理位置与逻辑关系一致
在顺序存储结构中,数据元素的物理位置和逻辑关系是完全对应的。例如,对于一个线性表 L = {a1,a2,a3, … , an},假设存储在数组 A 中,那么 A[i] 就是线性表中的第 i + 1 个元素。如果要访问线性表中的第 i 个元素,直接通过数组下标 i - 1 就可以快速定位,时间复杂度为 O(1)。这种直接通过下标访问元素的特性使得顺序存储结构在查找等操作中效率很高。
- 存储空间连续性要求高
由于需要连续的存储空间,这就对内存的分配有一定的要求。在实际应用中,如果要存储一个很大的线性表,可能需要预先分配足够大的内存空间。而且在存储空间不足的情况下,很难动态地扩展存储空间,不像链式存储那样可以灵活地申请和释放内存,造成内存空间的浪费。
- 访问速度快
由于数据元素在内存中是连续存储的,通过下标可以直接快速地访问任意位置的元素。这种高效的随机访问能力使得顺序存储结构在需要频繁查找元素的应用场景中表现出色。
- 存储密度高
顺序存储结构除了存储数据元素本身外,不需要额外的存储空间来存储指针等信息(与链式存储结构相比)。这使得存储空间的利用率较高,对于存储空间有限的系统来说是一个很大的优势。
- 插入和删除效率低
在顺序存储结构中进行插入和删除操作时,往往需要移动大量的元素来保持线性表的顺序性。这使得插入和删除操作的时间复杂度较高,为 O(n)。例如,当线性表很长时,在表头插入或删除一个元素,需要移动整个线性表的元素,效率非常低。
代码举例
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SLDataType;
#define INIT_CAPACITY 3
typedef struct SeqList
{
SLDataType* a;
SLDataType size;//有效数据个数
SLDataType capacity;//空间的容量
}SL;//动态顺序表插入代码片
1. 内存空间初始化
void SLInit(SL* ps)//动态开辟一块空间
{
assert(ps);
ps->a = (SLDataType*)malloc(sizeof(SLDataType) * INIT_CAPACITY);
if (ps->a == NULL)
{
perror("malloc fail");
return;
}
ps->size = 0;
ps->capacity = INIT_CAPACITY;
}
2. 空间销毁
void SLDestroy(SL* ps)
{
assert(ps);
free(ps->a);
ps->capacity = ps->size = 0;
}
3. 空间扩容
void SLCheckCapacity(SL* ps)
{
assert(ps);
if (ps->capacity == ps->size)
{
SLDataType* tmp = (SLDataType*)realloc(ps->a, sizeof(SLDataType) * ps->capacity*2);
if (tmp == NULL)
{
perror("realloc fail");
return;
}
ps->a = tmp;
ps->capacity *=2;
}
}
4. 代码的打印
void SLPrint(SL* ps)
{
assert(ps);
for (int i = 0; i < ps->size; i++)
{
printf("%d ", ps->a[i]);
}
printf("\n");
}
5. 在尾部插入数据
- 判断指向这一空间的指针是否位野指针
- 判断空间是否足够,不够则需扩容
- 插入数据
void SLPushBack(SL* ps, SLDataType x)//尾插
{
assert(ps);
SLCheckCapacity(ps);
ps->a[ps->size++] = x;
}
6. 在尾部删除数据
- 判断指向这一空间的指针是否位野指针
- 判断是否有数据
- 删除数据
void SLPopBack(SL* ps)//尾删
{
assert(ps);
assert(ps->size > 0);
ps->size--;
}
7. 在头部插入数据
- 判断指向这一空间的指针是否位野指针
- 判断空间是否足够,不够则需扩容
- 插入数据
void SLPushFront(SL* ps, SLDataType x)//头插
{
assert(ps);
SLCheckCapacity(ps);
int end = ps->size - 1;
while (end >= 0)
{
ps->a[end + 1] = ps->a[end];
end--;
}
ps->a[0] = x;
ps->size++;
}
8. 头部数据的删除
- 判断指向这一空间的指针是否位野指针
- 判断是否有数据
- 删除数据
void SLPopFront(SL* ps)//头删
{
assert(ps);
int begin = 1;
assert(ps->size > 0);
while (begin <= ps->size)
{
ps->a[begin - 1] = ps->a[begin];
begin++;
}
ps->size--;
}
9. 在中间某位置插入数据
- 判断指向这一空间的指针是否位野指针
- 判断插入位置是否超出该空间
- 插入数据
void SLInsert(SL* ps, int pos, SLDataType x)
{
assert(ps);
SLCheckCapacity(ps);
assert(pos>0 && pos <= ps->size);
int end = ps->size - 1;
while (end >= pos)
{
ps->a[end + 1] = ps->a[end];
end--;
}
ps->a[pos] = x;
ps->size++;
}
10. 删除中间某一位置数据
- 判断指向这一空间的指针是否位野指针
- 判断插入位置是否超出该空间
- 删除数据
void SLErase(SL* ps, int pos)
{
assert(ps);
assert(pos > 0 && pos < ps->size);
int begin = pos;
while (begin < ps->size)
{
ps->a[begin - 1] = ps->a[begin];
begin++;
}
ps->size--;
}
代码的测试
void testseqlist()
{
SL s;
SLInit(&s);//初始化
SLPushBack(&s, 1);//尾插
SLPushBack(&s, 2);
SLPushBack(&s, 3);
SLPushBack(&s, 4);
SLPushBack(&s, 5);
SLPushBack(&s, 6);
SLPrint(&s);//打印
SLPopBack(&s);//尾删
SLPopBack(&s);
SLPrint(&s);//打印
//SLDestroy(&s);
SLPushFront(&s, 3);//头插
SLPushFront(&s, 3);
SLPushFront(&s, 3);
SLPushFront(&s, 3);
SLPrint(&s);//打印
SLPopFront(&s);//头删
SLPopFront(&s);
SLPopFront(&s);
SLPopFront(&s);
SLPrint(&s);//打印
SLInsert(&s, 2, 9);//中间插入
SLInsert(&s, 2, 9);
SLInsert(&s, 2, 9);
SLInsert(&s, 2, 9);
SLInsert(&s, 2, 9);
SLPrint(&s);
SLErase(&s, 2);//中间删除
SLErase(&s, 2);
SLErase(&s, 2);
SLErase(&s, 2);
SLPrint(&s);
}
int main()
{
testseqlist();
return 0;
}
热门推荐
英镑汇率暴跌,英国留学真的省钱了吗?
最新英镑兑人民币汇率走势揭秘:从8.94到10.81,投资者和旅行者该如何应对?
英镑暴跌,人民币汇率创新高!
春节亲子游去哪儿?长兴、北京、烟台超值推荐!
春节云南亲子游,探寻历史文化
成都VS山西:春节亲子游去哪儿更划算?
2025年春节亲子游,这些地方绝对值得一去!
江苏句容推出8条四季旅游线路,邀你领略“金陵御花园”的四季风光
韩琦笔下的四季:月季花开,四季如春
双十一囤货指南:洋河天之蓝&古井贡酒谁更值得买?
墨染青衣教你取个高雅网名
从“花开宿语”看文化自信:高雅网名背后的哲学思潮
古风网名爆火,你get了吗?
糖尿病患者一日三餐这样吃,血糖控制更轻松
糖化血红蛋白:糖尿病管理的金标准指标与异常处理指南
饺子冷冻后,保质期能有多久?最好在这个时间前吃完
“皇帝长寿菜”无实证,茄子营养价值却很高
茄子富含抗炎成分,多重营养守护健康
寒假打卡北京科技馆:亲子游必备攻略
《鳄鱼小顽皮爱洗澡》:一款适合5-6岁孩子的亲子游戏
傅延龄:黑芝麻这样吃,补肾乌发效果好
黑芝麻山药苹果糊:冬季养生的完美选择
光伏农业创新模式涌现,助力乡村振兴破千亿
冯承素、虞世南、褚遂良:故宫珍藏兰亭集序摹本全览
文言文《兰亭集序》知识点详解
科目四几大题型常考知识点!
自制饮品风靡,蜂蜜柠檬百香果沁饮超简单!
自制小麦草汁:夏日健康饮品新选择
自制饮品风靡朋友圈,健康又好玩!
每天六场免费体验!开封府上演全息版“包公断案”