数据结构所讲述的是数据的存储、组织方式
其中最基础的就是线性表了,什么是线性表?顾名思义,就是在逻辑结构上为一条直线的存储方式,主要分为顺序表和链表两种存储形式,今天我们主要来了解一下顺序表。
顺序表
物理存储形式
顺序表的物理存储形式和数组一样,都是在内存中开辟一串连续的存储空间来进行存储,其形式如下:
顺序表有静态和动态存储两种之分,静态存储限制了存储空间的大小,不能再增加,而动态存储则可以按需增加存储单元,上图就是一个动态的存储形式。
代码实现
#include<stdio.h>
#include<stdlib.h>
#define SQLIST_SPACE 20 //初始容量
#define NEW_SPACE 4 //增加容量
typedef int DataType;
typedef struct SqList
{
DataType* array;
size_t size; //有效数据
size_t capacity; //容量
}sqList;
//初始化
void SqListInit(sqList* sl);
//扩容
void Expand(sqList* sl);
//在pos位置插入
void sqListInsert(sqList* sl, int pos, DataType value);
//头插
void HeadPush(sqList* sl, DataType value);
//尾插
void TailPush(sqList* sl, DataType value);
//在pos位置删除
void sqListDelete(sqList* sl, int pos);
//头删
void HeadPop(sqList* sl);
//尾删
void TailPop(sqList* sl);
//查找
int SqListFind(sqList* sl, DataType value);
//打印
void SqListPrint(sqList* sl);
void SqListInit(sqList* sl)
{
sl->array = (DataType*)malloc(sizeof(DataType) * SQLIST_SPACE);
if (sl->array == NULL)
{
return;
}
sl->size = 0;
sl->capacity = SQLIST_SPACE;
}
void Expand(sqList* sl)
{
if (sl->size == sl->capacity)
{
sl->capacity += NEW_SPACE;
sl->array = (DataType*)realloc(sl->array, sizeof(DataType) * sl->capacity);
if (sl->array == NULL)
{
return;
}
}
}
void sqListInsert(sqList* sl, int pos, DataType value)
{
size_t count = sl->size;
Expand(sl);
if (pos < 0 || pos > sl->size)
{
return;
}
while (count > pos)
{
sl->array[count] = sl->array[count - 1];
count--;
}
sl->array[pos] = value;
sl->size++;
}
void HeadPush(sqList* sl, DataType value)
{
sqListInsert(sl, 0, value);
}
void TailPush(sqList* sl, DataType value)
{
sqListInsert(sl, (int)sl->size, value);
}
void sqListDelete(sqList* sl, int pos)
{
if (pos < 0 || pos >= sl->size)
{
return;
}
while (pos < sl->size - 1)
{
sl->array[pos] = sl->array[pos + 1];
pos++;
}
sl->size--;
}
void HeadPop(sqList* sl)
{
sqListDelete(sl, 0);
}
void TailPop(sqList* sl)
{
sqListDelete(sl, (int)sl->size - 1);
}
int SqListFind(sqList* sl, DataType value)
{
int count = 0;
while (count < sl->size)
{
if (sl->array[count] == value)
{
return count;
}
count++;
}
return -1;
}
void SqListPrint(sqList* sl)
{
for (int i = 0; i < sl->size; i++)
{
printf("%d ", sl->array[i]);
}
printf("\n");
}
顺序表优缺点
优点
1、顺序表最大的优点就是支持随机访问
缺点
1、除了表尾插入操作时间复杂度为O(1)外,其他位置插入时间复杂度都为O(n)
2、有增容代价
适用场景
顺序表比较适用于频繁访问存储数据的情况