写在前面:本文章来自于在学习过程中的总结,供大家参考。因水平有限,博客中难免会有不足,恳请大佬们不吝赐教!


文章目录

  • 线性表的定义
  • 线性表的顺序存储结构
    • 线性表顺序存储结构的优缺点
    • 线性表的基本操作
    • 顺序存储结构数据的插入和删除

线性表的定义

线性表:由零个或多个数据元素组成的有限序列。简单的说,就像排队一样,具有先一样性质的结构。

关键

  • 首先它是一个序列,也就是说元素之间是有个先来后到的。
  • 若元素存在多个,则第一个无前驱,而最后一个元素无后继,其他元素有且只有一个前驱和后继。
  • 另外,线性表强调是有限的,事实上无论计算机发展到多强大,它所处理的元素都是有限的。

数据元素的个数称为线性表的长度,当线性表长度为零时,称为空表。

表起始位置称表头,表结束位置称表尾。

线性表的顺序存储结构

线性表有两种物理存储结构 :顺序存储结构和链式存储结构。

线性表的顺序存储结构:用一段地址连续的存储单元依次存储线性表的数据元素。

物理上的存储方式事实上就是在内存中找个初始地址,然后通过占位的形式,把一定的内存空间给占了,然后把相同数据类型的数据元素依次放在这块空地中。

#define MAXSIZE 20
typedef int ElemType;
typedef struct
{ElemType data[MAXSIZE];
int length; //线性表当前长度
}SqList;

这里封装了一个结构,事实上就是对数组进行封装,增加了当前长度的变量罢了。

顺序存储结构的封装需要三个属性

  • 存储空间的起始位置,数组data,它的存储位置就是线性表存储空间的存储位置。
  • 线性表的最大存储容量:数组的长度MAXSIZE
  • 线性表的当前长度:length

注意:数组的长度与线性表的当前长度要区分一下:数组的长度是存放线性表的存储空间的总长度,一般初始化后不变。而线性表的当前长度是线性表中元素的个数,是会变化的。

线性表顺序存储结构的优缺点

线性表的顺序存储结构,在存、读数据时,不管是在哪个位置时,时间复杂度都是O(1)。而在插入或删除时,时间复杂度都是O(n)。

这就说明,它比较适合元素个数比较稳定,不经常插入和删除元素,而更多的操作是存取数据的应用。

优点:

  • 无须为表示元素之间的逻辑关系而增加额外的存储空间。
  • 可以快速存取表中任意位置的元素。
    缺点:
  • 插入和删除操作需要移动大量元素。
  • 当线性表长度变化较大时,难以确定存储空间的容量。
  • 容易遭成存储空间的“碎片”。

为什么当插入和删除时,就要移动大量的元素?因为在相邻两元素的存储位置也具有邻居关系,它们在内存中的位置是紧挨着的,中间没有间隙,当然就无法快速插入和删除。

线性表的基本操作

顺序存储结构数据的插入和删除

数据的插入:

//数据元素的插入
Status ListInsert(SqList* L, int i, ElemType e)
{int k;if (L->length == MAXSIZE)   //顺序线性表已满return ERROR;if (i<1 || i>L->length - 1)  //当i不在范围内时return ERROR;if (i <= L->length)   //若插入数据位置不在表尾{for (k = L->length - 1; k >= i - 1; k--)L->data[k + 1] = L->data[k];}L->data[i - 1] = e;L->length++;return OK;
}

数据的删除:

//数据元素的删除
Status ListDelete(SqList* L, int i)
{int k;if (L->length == 0) //线性表为空return ERROR;if (i<1 || i>L->length)    //当i不在范围时return ERROR;if (i < L->length)  //如果删除不是最后位置{for (k = i; k < L->length; k++)   //将删除位置后继元素前移L->data[k - 1] = L->data[k];}L->length--;return OK;
}

完整代码:

#include <stdio.h>
#include <malloc.h>#define MAXSIZE 20
typedef int ElemType;
typedef struct
{ElemType data[MAXSIZE];int length;
}SqList;#define OK 1
#define ERROR 0
#define TURE 1
#define FALSE 0
typedef int Status;//数据元素的获取
Status GetElem(SqList L, int i, ElemType* e)
{if (L.length == 0 || i<1 || i>L.length)return ERROR;*e = L.data[i - 1];return OK;
}//数据元素的插入
Status ListInsert(SqList* L, int i, ElemType e)
{int k;if (L->length == MAXSIZE)   //顺序线性表已满return ERROR;if (i<1 || i>L->length - 1)  //当i不在范围内时return ERROR;if (i <= L->length)   //若插入数据位置不在表尾{for (k = L->length - 1; k >= i - 1; k--)L->data[k + 1] = L->data[k];}L->data[i - 1] = e;L->length++;return OK;
}//数据元素的删除
Status ListDelete(SqList* L, int i)
{int k;if (L->length == 0) //线性表为空return ERROR;if (i<1 || i>L->length)    //当i不在范围时return ERROR;if (i < L->length)  //如果删除不是最后位置{for (k = i; k < L->length; k++)   //将删除位置后继元素前移L->data[k - 1] = L->data[k];}L->length--;return OK;
}
int main()
{SqList *L;int i = 0;L = (SqList*)malloc(sizeof(SqList));L->length = 0;for (i = 0; i < 3; i++){scanf("%d", &L->data[i]);L->length++;}//ListInsert(L, 1, 4);ListDelete(L, 1);printf("%d\n", L->length);for (i = 0; i < L->length; i++){printf("%d\n", L->data[i]);}return 0;
}

由于水平有限,博客难免会有不足,恳请大佬们不吝赐教!

线性表定义 线性表顺序存储结构相关推荐

  1. teradata 查看 表定义_Teradata表类型

    Teradata支持以下表格类型来保存临时数据. 派生表 挥发性表 全球临时表 派生表 派生表在查询中创建,使用和删除.这些用于在查询中存储中间结果. 例 以下示例使用薪金大于75000的雇员记录创建 ...

  2. 数据结构开发(3):线性表的顺序存储结构

    0.目录 1.线性表的本质和操作 2.线性表的顺序存储结构 3.顺序存储结构的抽象实现和具体实现 3.1 SeqList 3.2 StaticList 和 DynamicList 4.顺序存储线性表的 ...

  3. 顺序表(详解)- C++(线性表顺序存储结构)

    问题引入 在数据结构中,线性表是一种很重要的线性结构.线性表分为多种类型,常见的如顺序表.链表等,如果此时此刻你对"顺序表(顺序存储)"感到困惑,那就继续看下去,我们一步一步去剖析 ...

  4. Java数据结构(1.1):数据结构入门+线性表、算法时间复杂度与空间复杂度、线性表、顺序表、单双链表实现、Java线性表、栈、队列、Java栈与队列。

    数据结构与算法入门 问题1:为什么要学习数据结构          如果说学习语文的最终目的是写小说的话,那么能不能在识字.组词.造句后就直接写小说了,肯定是不行的, 中间还有一个必经的阶段:就是写作 ...

  5. 基于顺序存储结构的图书信息表

    利用结构体数组模拟实现线性表 例题一 基于顺序存储结构的图书信息表的创建和输出 题目描述 定义一个包含图书信息(书号.书名.价格)的顺序表,读入相应的图书数据来完成图书信息表的创建,然后统计图书表中的 ...

  6. Db2: db2look导出的表定义无法用于创建表-SQL1860N Reason code = “5“

    问题描述: 使用db2look导出表定义,然后再使用该定义创建表报错 SQL1860N RC=5,导出的表定义如下: db2 "CREATE TABLE mqs20201208 (      ...

  7. python数据库建表_mysql数据表如何创建

    在 MySQL 中,可以使用 CREATE TABLE 语句创建表.其语法格式为:CREATE TABLE <表名> ([表定义选项])[表选项][分区选项]; 其中,[表定义选项]的格式 ...

  8. 数据结构和算法:(3)3.1线性表的顺序存储结构

    -----------------------1.线性表基础操作------------------------ 线性表:(List)由零个或多个数据元素组成的有限序列. 首先他是一个序列,元素之间是 ...

  9. 第三章 线性表---顺序存储结构

    线性表(List):零个或多个数据元素的有限序列. 若将线性表记为(a1, ..., ai-1, ai , ai+1 , ..., an),则表中 ai-1 领先于ai , ai领先于ai+1,称ai ...

最新文章

  1. eclipse 出现user operation is waiting
  2. canvas百分比加载动画
  3. MySQL两种表存储结构MyISAM和InnoDB的性能比较测试
  4. python定_Python 定值类
  5. 企业官网建设搞清三个定位
  6. 互联网架构,究竟为啥要做服务化?
  7. 《秋暮登北楼》王武陵
  8. javascript setinterval 正确的语法
  9. 不用GAN、VAE,谷歌发明视频生成的扩散模型,实现新SOTA
  10. XM7 FOR ANDROID,如何使用Android Studio开发Gradle插件
  11. 现在装修还有必要铺设网线吗?
  12. 枚举编写单例是可以保证在多线程中的安全性
  13. 第二章 如何在VS2008里面编译CG
  14. Android通过post请求发送一个xml,解析返回xml数据
  15. ModuleNotFoundError: No module named ‘MySQLdb‘
  16. Mutex(互斥锁)
  17. Vista暴力破解器只是一个玩笑 谁说破解谁撒谎
  18. **数据挖掘--决策树ID3算法(例题)
  19. 硕士论文latex参考文献格式经验
  20. linux用ping命令测试网速,Linux通过终端测试网速

热门文章

  1. 运放參数解释及经常使用运放选型
  2. 为何都喜欢喝酱香型白酒,酱香型白酒和浓香型白酒有何区别? - 知乎
  3. MATLAB绘制泰勒图(Taylor diagram)
  4. 信息流广告投放有哪些?
  5. 地震信号的一些基本概念
  6. carsim与simulink联合仿真 动驱动 两轮独立驱动电动汽车控制策略。 分为低速和高速两种策略优化分配驱动力矩
  7. 网站页面实现分享到微信、QQ空间新浪微博等网站的方法
  8. 在个股回测中,如何才能避开新股的一字涨停?
  9. project2007的一些使用心得
  10. Faces la Carte: 根据目击者描述自动生成目标人脸图像