【数据结构】详解顺序表(图解)
创始人
2024-01-18 23:38:15

目录

  • 一、顺序表的概念
    • 1.1、静态顺序表
    • 1.2、动态顺序表
  • 二、接口实现
    • 2.1、开辟一个动态顺序表及初始化
    • 2.2、顺序表的增容
    • 2.3、顺序表的尾插及尾删
    • 2.4、顺序表的头插及头删
    • 2.5、顺序表在pos处插入及删除数据
    • 2.6、顺序表的销毁及打印
    • 2.7、顺序表的查找及修改


一、顺序表的概念

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般采用数组存储,在数组上完成数组的增删查改操作。

顺序表可分为:

1.1、静态顺序表

静态顺序表是使用定长数组存储元素。空间小了,不够用,空间大了,浪费。所以静态顺序表不实用。

#define N 10
typedef int SLDataType;
typedef struct SeqList
{SLDataType a[N]; // 定长数组int size; // 记录存储多少个数据
}SL;

1.2、动态顺序表

动态顺序表是使用动态开辟的数组存储

typedef int SLDataType;
typedef struct SeqList
{SLDataType* a; // 指向动态开辟的数组int size; // 记录存储多少个有效数据int capacity; // 空间容量大小
}SL;

二、接口实现

由于静态顺序表不实用,所以现实中基本都是使用动态顺序表,下面我们来实现动态顺序表

2.1、开辟一个动态顺序表及初始化

1、开辟一个动态顺序表

typedef int SLDataType;
typedef struct SeqList
{SLDataType* a; // 指向动态开辟的数组int size; // 记录存储多少个有效数据int capacity; // 空间容量大小
}SL;

在这里插入图片描述

2、顺序表的初始化

void SLInit(SL* ps)
{assert(ps);ps->a = NULL;ps->size = 0;ps->capacity = 0;
}

将指向动态开辟的数组置为NULL。

2.2、顺序表的增容

先对空间进行判断,若空间为0,则先开辟空间,空间不够,再自动增加空间

代码实现:

void SLCheckCapacity(SL* ps)
{assert(ps);if (ps->size == ps->capacity){int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;SLDataType* tmp = (SLDataType*)realloc(ps->a, newCapacity*sizeof(SLDataType));if (tmp == NULL){perror("realloc fail");exit(-1);}ps->a = tmp;ps->capacity = newCapacity;}
}

2.3、顺序表的尾插及尾删

1、顺序表的尾插

尾插即是向数组的尾部插入数据,先调用扩容函数SLCheckCapacity判断空间,当尾部空间不够时,就会自动扩容。

在这里插入图片描述

代码实现:

void SLPushBack(SL* ps, SLDataType x)
{assert(ps);// 扩容SLCheckCapacity(ps);ps->a[ps->size] = x;ps->size++;
}

2、顺序表的尾删

尾删就是将数据从尾部开始删除

在这里插入图片描述

代码实现:

void SLPopBack(SL* ps)
{assert(ps);assert(ps->size > 0); // 检查数据是否为NULLps->size--;
}

2.4、顺序表的头插及头删

1、顺序表的头插

顺序表头插就是从数组的起始位置开始插入数据。先判断空间,再把已有的数据向后挪动,然后在头部插入数据。

在这里插入图片描述
代码实现:

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++;
}

2、顺序表的头删

顺序表的头删是从数组的起始位置删除数据。把起始位置之后的数据向前挪动,覆盖要删除的数据

在这里插入图片描述

代码实现:

void SLPopFront(SL* ps)
{assert(ps);assert(ps->size > 0);int begin = 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;
}

2.5、顺序表在pos处插入及删除数据

1、顺序表在pos处插入数据

顺序表在pos处插入数据是在数组中自定义位置插入数据。先判断空间,再把要插入数据位置之后的数据向后挪动,然后插入数据。

在这里插入图片描述
代码实现:

void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0);assert(pos <= ps->size);SLCheckCapacity(ps);int end = ps->size - 1;while (end >= pos){ps->a[end + 1] = ps->a[end];end--;}ps->a[pos] = x;ps->size++;
}

pox=ps->size,则函数SLInsert等价于尾插
pox=0,则函数SLInsert等价于头插

2、顺序表在pos处删除数据

顺序表在pos处删除数据是在数组中自定义位置删除数据。把自定义位置处的数据向前挪动,覆盖要删除的数据。

在这里插入图片描述
代码实现:

void SLErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0);assert(pos < ps->size);// 挪动数据覆盖int begin = pos + 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;
}

pox=ps->size-1,则函数SLInsert等价于尾删
pox=0,则函数SLInsert等价于头删

2.6、顺序表的销毁及打印

1、顺序表的销毁

由于动态顺序表开辟空间,所用的函数均是动态内存函数,所以使用完后需要释放空间

代码实现:

void SLDestroy(SL* ps)
{assert(ps);if (ps->a){free(ps->a);ps->a = NULL;ps->size = ps->capacity = 0;}
}

2、顺序表的打印
代码实现:

void SLPrint(SL* ps)
{assert(ps);for (int i = 0; i < ps->size; ++i){printf("%d ", ps->a[i]);}printf("\n");
}

2.7、顺序表的查找及修改

1、顺序表的查找

从begin处开始查找

代码实现:

int SLFind(SL* ps, SLDataType x, int begin)
{assert(ps);for (int i = begin; i < ps->size; ++i){if (ps->a[i] == x){return i;}}return -1;
}

2、顺序表的修改

把pos处的数据修改成x
代码实现:

void SLModify(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);ps->a[pos] = x;
}

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
苁蓉的食用方法 鲜苁蓉的吃法有... 肉苁蓉号称“温而不热,补而不峻,暖而不燥,滑而不泄,故有从容之名。”历来也是传统药食同源的滋补佳品。...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
阳澄湖在哪里哪个省的 阳澄湖是... 点击题目下方苏州生活指南有用 有趣 有态度近期的阳澄湖度很高,3月24日,央视二套《第一时间》直播连...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...