当前位置: 首页 > news >正文

江西网站建设与推广河北网站建设

江西网站建设与推广,河北网站建设,花都企业网站建设,推广营销海外网站目录 1. 顺序表介绍 2. 顺序表工程 2.1 顺序表定义 2.1.1 静态顺序表 2.1.2 动态顺序表 2.2顺序表接口 2.2.1 顺序表初始化 2.2.2 顺序表打印 2.2.3 顺序表销毁 2.2.4 顺序表数据插入 2.2.4.1 容量检查 2.2.4.2 顺序表尾插 2.2.4.3 顺序表头插 2.2.4.4 顺序表随机…

目录

1. 顺序表介绍

2. 顺序表工程

2.1 顺序表定义

2.1.1 静态顺序表

2.1.2 动态顺序表

2.2顺序表接口

2.2.1 顺序表初始化

2.2.2 顺序表打印

2.2.3 顺序表销毁

2.2.4 顺序表数据插入

2.2.4.1 容量检查

2.2.4.2 顺序表尾插

2.2.4.3 顺序表头插

2.2.4.4 顺序表随机插入

2.2.5 顺序表数据删除

2.2.5.1 顺序表尾删

2.2.5.2 顺序表头删

2.2.5.3 顺序表随机删除

 2.2.6 顺序表查找

3. 顺序表总结反思


1. 顺序表介绍

        顺序表,顾名思义就是顺序储存数据的数据管理方式。在物理层面来看,顺序表将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。 

         因为顺序表采用的是一段物理地址连续的储存单元一次存储数据元素,所以我们一般会采用数组的方式来存储。涉及到数组的存储,我们便会有两种方式,一种是静态的顺序表,即使用定长的数组来存储元素;而我们今天介绍的是另一种动态的顺序表,即采用动态开辟的数组进行数据的存储。

2. 顺序表工程

        对于一个顺序表工程,我们一般模式需要分为三部分。

        SeqList.h 为头文件,其中包含库函数头文件的包含,顺序表结构体的定义与声明,接口函数的声明。

        SeqList.c 包含接口函数的定义。

        Test.c 是我们的测试源文件,从这里进入main函数。

2.1 顺序表定义

        在描述一个顺序表时,我们需要多个顺序表的信息才能方便我们对其进行管理,所以我们可以定义一个结构体,其中包含顺序表的存储数组与元素个数等信息。

2.1.1 静态顺序表

        我们前面提到静态顺序表采用的数据存储方式为定长数组,所以在静态顺序表的结构体内,需要包含数据存储的数组与已经存储的数据个数。

//静态顺序表
#define N 10typedef int SLDataType;typedef struct SeqList
{SLDataType data[N];//定长数组size_t size;//存储数据个数
}SeqList;

         由于静态顺序表的数组大小已经给定,所以很容易产生空间不够或者浪费过大的情况,所以我们会更倾向于寻求动态开辟空间的方法来管理顺序表,以此来灵活管理空间。

2.1.2 动态顺序表

        想要管理好一个动态顺序表,我们创建的结构体中不仅要有存储数据的数组与有效数据个数,还应该有数组容量大小的说明,以便于我们及时对顺序表的空间做出调整。

//动态顺序表typedef int SLDataType;typedef struct SeqList
{int size;//有效数据个数int capacity;//顺序表容量SLDataType* data;//顺序表动态开辟数组地址
}SL;

2.2顺序表接口

        我们在使用顺序表时,需要一些函数接口来帮助我们实现数据的插入与删除等功能,所以最关键的部分也就是增删查改功能接口函数的实现。

2.2.1 顺序表初始化

        当我们新建一个顺序表,我们需要对其进行参数预置,也就是初始化。

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

2.2.2 顺序表打印

        我们想要在屏幕上看到顺序表存储的数据内容即可调用打印函数,将顺序表数据依次打印在屏幕上。

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

2.2.3 顺序表销毁

        当顺序表不再被使用时,我们应该调用销毁函数,即使销毁顺序表释放空间。

void SeqListDestroy(SL* ps)
{assert(ps);if (ps->data != NULL){ps->size = 0;ps->capacity = 0;free(ps->data);ps->data = NULL;}
}

2.2.4 顺序表数据插入

        在管理顺序表数据时,常常涉及到数据插入,常见的插入数据的方式有:头插,即在顺序表地址最小(头部)的位置插入新的数据;尾插,即在顺序表地址最大(尾部)的位置插入新的数据;随机插入,即在指定下标位置插入新的数据。

2.2.4.1 容量检查

        在插入数据的时候,需要注意到容量的问题,再每一次插入数据时,我们都需要关注空间是否充足,所以我们需要对容量进行检查。当容量不够时采用realloc函数来重新设置空间大小,一般采取空间扩大为原先的二倍的方式。需要注意的是由于我们初始化容量为0,所以扩容时要防止在0的基础上扩大二倍的情况。

void CheckCapacity(SL* ps)
{if (ps->size < ps->capacity){return;}else{int newcapacity = ps->capacity == 0 ? 4 : 2 * (ps->capacity);SLDataType* tmp = (SLDataType*)realloc(ps->data, sizeof(SLDataType) * newcapacity);if (tmp == NULL){perror("realloc");exit(-1);}ps->data = tmp;ps->capacity = newcapacity;}
}

        将容量检查打包成为一个函数,在之后的插入过程中只需要调用该函数即可解决容量的问题。

2.2.4.2 顺序表尾插

        尾插很容易,只需要在数据最后一个元素(size-1)的后一个位置(size)存入新数据,并令有效数据个数加一即可。

void SLPushBack(SL* ps, SLDataType x)
{assert(ps);CheckCapacity(ps);ps->data[ps->size] = x;ps->size++;
}
2.2.4.3 顺序表头插

        头插时涉及到数据的移位,即整体数据向后移动一个位置,才能在头部有空间插入新的数据而不干扰原数据。我们可以采用循环来解决。

void SLPushFront(SL* ps, SLDataType x)
{assert(ps);CheckCapacity(ps);int tmp = ps->size;while (tmp){ps->data[tmp] = ps->data[tmp - 1];tmp--;}ps->data[0] = x;ps->size++;
}
2.2.4.4 顺序表随机插入

        随机插入时涉及到另一个参数即下标参数,只需要采用头插的思想,将指定下标后的数据向后移动一位即可。

void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);CheckCapacity(ps);int tmp = ps->size;while (tmp > pos){ps->data[tmp] = ps->data[tmp - 1];tmp--;}ps->data[pos] = x;ps->size++;
}

2.2.5 顺序表数据删除

        与顺序表的插入类似,顺序表的删除也有多种方式,常见的删除数据的方式有:头删,即删除在顺序表地址最小(头部)的位置的数据;尾删,即删除在顺序表地址最大(尾部)的数据;随机删除,即删除在指定下标位置的数据。

        删除不许要考虑容量,但是需要关心有效数据个数是否为0,使用assert断言即可。

2.2.5.1 顺序表尾删

        尾删很简单,只需要将有效数据个数减一即可,至于原来的最后一个数据是多少不需要关心,因为有效数据个数限制我们不会去考虑它。

void SLPopBack(SL* ps)
{assert(ps);assert(ps->size > 0);ps->size--;
}
2.2.5.2 顺序表头删

        顺序表头删也涉及到数据覆盖的问题,设计循环将每一位的后一位向前移动覆盖即可。

void SLPopFront(SL* ps)
{assert(ps);assert(ps->size > 0);int tmp = 0;while (tmp < ps->size - 1){ps->data[tmp] = ps->data[tmp + 1];tmp++;}ps->size--;
}
2.2.5.3 顺序表随机删除

        随机删除是删除指定下标的数据,只需要将其后的数据参照头删的方式向前移动覆盖即可。

void SLErase(SL* ps, int pos)
{assert(ps);assert(ps->size > 0);int tmp = pos;while (tmp < ps->size - 1){ps->data[tmp] = ps->data[tmp + 1];tmp++;}ps->size--;
}

 2.2.6 顺序表查找

        查找要求查找指定数据,若找到返回其下标,否则返回-1。因此只需要遍历顺序表一一比较即可。

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

3. 顺序表总结反思

        顺序表以其物理空间连续为最大的“卖点”,同时由于其存储物理空间连续也延伸出了优劣势。

        其优势在与因为物理空间连续,所以访问数据很方便快捷。其劣势也是由于物理空间连续,导致在头插和头删等操作时,我们需要移动所有的数据来保持其物理空间连续的特性,改变数据开销就会变得很大。

http://www.yayakq.cn/news/262203/

相关文章:

  • 网页设计个人网站设计通州手机网站建设
  • 网站开发 源代码吾道ppt模板免费下载
  • 成都网站建设小程序北京学校线上教学
  • 网站开发的硬件环境和软件怎么写百度首页排名优化哪家专业
  • 网站建设张家港株洲建设工程造价信息网站
  • 网站设计公司排行榜wordpress被js挂马
  • 腾讯云电商网站建设北京网站开发公司哪家好
  • 网站解析错误飞猪关键词排名优化
  • 内蒙古建设厅网站官网济南企业网站搭建
  • 深圳seo推广英文seo推广
  • 网站开发框架是什么如何更改地图上的店名
  • 推广软件公司潍坊seo管理
  • 网站建设与管理教案网红营销案例
  • 做网站如何不被忽悠东营 微信网站建设
  • vultr怎么做网站广州做网站公司培训
  • 微信知彼网络网站建设wordpress主题转typecho
  • 广州企业网站制作公司张家港网站建设培训学校
  • 小区服务网站怎么做包头seo哪家专业
  • 下列哪些属于营销型网站的基础建设如何注销网站
  • 随州网站建设有限公司怎样快速安装wordpress
  • 用wordpress搭建完整网站教程自己做的网站怎么赚钱
  • 网站设计精美案例深圳的网站建设公司价格
  • 行业网站开发公司阆中网站建设01hl
  • 外贸网站设计模板合肥网站建设开发电话
  • 广陵建设局网站WordPress云虚拟空间
  • 长沙网站建设技术百度下拉框推广网站
  • 销售方案网站网站建设书本信息
  • 全球访问量最大的网站小程序互动投票
  • 国外seo做的好的网站南宁网吧
  • 网站功能模块图查询网ip138子域名