线性表是由数据类型相同个数据元素组成的有限序列,通常记为:

其中n为表长,n=0时称为空表;下标i表示数据元素的位序

线性表的特点是组成它的数据元素之间是一种线性关系,即数据元素“一个接在另一个的后面排列,每一个数据元素的前面和后面都至多有一个其他数据元素”。

本文在介绍线性表的基本概念的基础上,重点介绍线性表的顺序表示及相应的算法


定义

线性表的顺序存储结构是指用一组地址连续(存储空间紧邻)的存储单元依次存储线性表的数据元素,用这种形式存储的线性表称为顺序表,因此顺序表的逻辑顺序和物理顺序是一致的,线性表中各个数据元素之间的逻辑关系可以由它们的存储地址来实现。

地址关系

设每个数据元素占据的存储块包括个存储单元,则第一个存储地址通常称为该数据元素的地址。的地址用表示,则第个数据元素的地址为:

      

数据元素的地址通常称为线性表的基地址。很显然有:

基本类型

(1)一维数组

一维数组在内存中占用的存储空间就是一组连续的存储区域,因此顺序表可以用一维数组来表示。但由于线性表有插入、删除等运算,它的长度是可变的,所以一维数组的长度需要定义得足够大,设用elem[MAXSIZE]来表示,其中MAXSIZE是一个根据实际问题定义的足够大的整数。此外,当前线性表中的实际元素个数可能达不到MAXSIZE那么多个,因此需要用一个变量length记录当前线性表中最后一个元素在数组中的位置,表空时length=0。例如:

#define MAXSIZE 100
DataType elem[MAXSIZE];
int length;

(2)动态数组

由于线性表所需的最大存储空间不容易确定,通常可以使用动态分配的一维数组来存储线性表。因此通常可以定义如下的结构来表示一个顺序表类型。

typedef struct
{DataType *elem;/*线性表的基地址*/int length;/*线性表当前的长度*/int listsize;/*线性表当前分配的最大存储容量*/
} SeqList;

1.初始化

顺序表的初始化即构造一个空表,用MAXSIZE表示最初分配给线性表的顺序存储空间的大小。

int InitSeqList(SeqList *L)
{L->elem = (DataType *)malloc(MAXSIZE * sizeof(DataType));if (L->elem == NULL){printf("error!\n");exit (-1);}L->length = 0;/*此时顺序表为空表*/L->listsize = MAXSIZE;return OK;
}

2.插入运算

顺序表的插入是指在序号为i的元素前面插入一个值为x的新元素,成为新的第i个元素。顺序表的插入运算的步骤如下:

(1)将顺序向后移动,以空出第i个元素的位置。

(2)将x置入空出的位置。

(3)修改顺序表的长度。

int InsertSeqList(SeqList *L, int i, DataType x)
{int j;if (L->length == L->listsize){printf("顺序表已满!");return (-1);}/*顺序表已满,不能插入*/else if (i<1 || i>L->length+1){printf("位置不合法!");return (0);}else{for (j=L->length; j>=i; j--){L->elem[j+1] = L->elem[j];L->elem[i] = x;/*新元素插入*/L->length++;/*表长加1*/return (1);/*插入成功,返回*/}}
}

若要通过不断插入来建立顺序表,只需在顺序表末端依次插入新元素即可。当输入非法字符或顺序表已满时,结束插入。

void SetSeqList(SeqList *L)
{int ret;while (L->length <= L->listsize){ret = scanf("DataType的格式转换符", &L->elem[L->length+1]);if (ret == 1){L->length++;}else//通过输入非法字符来结束插入{break;}}return;
}

3.删除运算

顺序表的删除运算是指将表中第i个元素从顺序表中去掉。顺序表的删除运算的步骤如下:

(1)将顺序向上移动。

(2)修改表长。

int DeleteSeqList(SeqList *L, int i)
{int j;if(i<1 || i>L->length)/*检查删除位置的合法性*/{printf("不存在第%d个元素", i);return 0;}else{for (j=i; j<=L->length; j++)/*向上顺序移动元素*/{L->elem[j] = L->elem[j+1];}}L->length--;/*表长减1*/return (1);
}

4.按值查找

顺序表中的按值查找是指在线性表中查找与给定值x相等的数据元素。在顺序表中完成该运算最简单的方法是线性查找法(顺序查找法)。

int SearchSeqList(SeqList *L, DataType x)
{int j = 1;while (j<=L->length && L->elem[j]!=x){j++;}if (j>L->length){return (-1);}else{return j;}
}

效率更高的办法还有折半查找(对分搜索)。现把我之前介绍过的这两种方法的文章链接给出如下:C语言丨线性查找(顺序查找);C语言丨折半查找(对分搜索)


可以证明,顺序表插入、删除、查找算法的时间复杂度都为


参考文献:

文益民 张瑞霞 李健 编著,数据结构与算法(第2版),清华大学出版社,P18,P20-24.

C语言丨线性表(一):顺序表相关推荐

  1. C语言丨线性查找(顺序查找)

    程序员在程序设计时常常需要对存储在数组中的大量数据进行处理,如排序.查找等.使用数据库时,用户可能需要频繁通过输入键字值来查找相应的记录.在数组中搜索一个特定元素的处理过程,称为查找.这次我们来介绍一 ...

  2. C语言丨线性表(二):线性链表(单链表)

    线性表是由数据类型相同的个数据元素组成的有限序列,通常记为: 其中n为表长,n=0时称为空表:下标i表示数据元素的位序. 线性表的特点是组成它的数据元素之间是一种线性关系,即数据元素"一个接 ...

  3. C语言丨线性表(四):循环链表

    线性表是由数据类型相同的个数据元素组成的有限序列,通常记为: 其中n为表长,n=0时称为空表:下标i表示数据元素的位序. 线性表的特点是组成它的数据元素之间是一种线性关系,即数据元素"一个接 ...

  4. 线性表之顺序表与单链表的区别及优缺点

    这里比较的是基于C语言实现的顺序表与单链表,与其他语言的实现可能会有差异,但我相信语言是相通的,它们的实现机制应该也差不多. 1.What 什么是顺序表和单链表 ①顺序表: 顺序表是在计算机内存中以数 ...

  5. 1-2、数据结构线性表之顺序表的基本操作插入、删除、遍历、初始化

    学习需要记录,更需要温习! 上一篇我们总结了什么是线性表,线性表的ADT类型,线性表的两种存储类型顺序存储结构和链式存储结构,今天正式进入线性表的顺序存储结构的总结和归纳,也就是数据结构的线性表的顺序 ...

  6. mysql 线性表_数据结构-线性表之顺序表

    线性表 (1)逻辑结构和物理结构 物理结构:数据元素在内存中真实的存放次序,有可能是连续存放的,也可能是散落于内存里. 逻辑结构:为了便于描述数据元素之间的关系,我们想象出数据之间应该有某种的对应关系 ...

  7. 线性表、顺序表以及ArrayList、Iterable、Collection、List中重要的方法

    线性表基本概念 线性表(linear list)是n个具有相同特性的数据元素的有限序列. 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表.链表.栈.队列.字符串 线性表在逻辑上是线性结构 ...

  8. 数据结构-线性表之顺序表

    线性表包括顺序表和链表(单链表.双链表等),这里我们简单探讨一下线性表中顺序表的基本操作和实现. 线性表其实就是对数组的一个实现,其逻辑上和物理存储上的地址都是连续的(数组的下标是从0开始的,而线性表 ...

  9. 数据结构与算法(一) 线性表之顺序表

     线性表是一种最简单.最常用的数据结构,根据存储方式可以分为顺序表和链表.  顺序表: 顺序表指的是用一组地址连续的存储单元依次存储线性表的数据元素,称为线性表的顺序存储结构或顺序映像(sequent ...

最新文章

  1. 详解英伟达三大专业视觉解决方案,覆盖数据中心和边缘计算
  2. Eigen入门之密集矩阵 3 - Array操作
  3. java耗时操作阻塞_spring boot高并发下耗时操作的实现方法
  4. 【Python】BMI指数 计算器
  5. No result defined for action com.lk.IndexAction and result success
  6. python语言的实验心得体会_爱的五种语言——“好妈妈”培训班家教情商课课堂纪实!...
  7. 自动量化炒股软件是什么?
  8. 计算机管理设置透明,怎么将电脑任务栏设置为透明
  9. Office Word 2010 2013 插入复选框 方框打勾 对号
  10. 黑客术语 什么是“0day”、“零日漏洞”?
  11. 批量删除微博的js代码
  12. VScode C/C++ 环境配置教程 (GCC)
  13. 制作一个简单七夕情人节表白网页(HTML+CSS)
  14. 计算机四年级上册语文教案,四年级语文上册的教案
  15. 静无止静,澎湃聆听——飞利浦T4507降噪真无线耳机上市
  16. 构建开源产业生态,加速落地云原生,骞云加入开源GitOps产业联盟
  17. 歹徒逃亡(目前只有1和2,过后会更)
  18. 基于java二次元信息分享平台计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
  19. Android 第三方库AgentWeb的使用
  20. 深度解析商业智能 BI 企业服务市场的快与慢

热门文章

  1. find_element 和find_elements 的区别
  2. CSS框模型,浮动,定位以及其他属性
  3. 全面解析Java的垃圾回收机制(转)
  4. STL不是线程安全的啊
  5. Oracle服务启动的问题
  6. 47 - 算法 - Leetcode-160 -相交链表
  7. 为什么mysql没有io多路复用_Redis凭啥可以这么快
  8. php实现soap,PHP的SOAP原理及实现详解
  9. 项目解析jsx文件_React 基础:JSX 扩展语法
  10. python用户标识符条件_使用sum(if…)或条件语句操作两个数据集,这些语句没有hivehadooppython的公共标识符...