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

线性表的顺序存储实现

前言

线性表的顺序存储及基本操作的实现


一、线性表

线性表(List)是由同类型数据元素构成有序序列的线性结构,用户处理线性表数据时常常需要初始化、查找、插入、删除、计算数据长度等操作。

线性表还包含以下几个要素:

表中元素个数称为线性表的长度

线性表没有元素时,称为空表

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

数据Data利用数组存储,利用下标使得查找 等操作十分方便。Last始终存储最后一个元素的数组下标,可以用于判断数组长度。在初始化时,Last的值为-1。

typedef struct LNode*List;
struct LNode{ElementType Data[MAXSIZE];  //利用数组的连续存储空间顺序存放线性表的各元素 int Last;         //指向最后一个元素
};
struct LNode L;
List PtrL;

二、操作集

线性表的基本操作包括:

List MakeEmpty(); //初始化一个空线性表 
ElementType KFind(int K,List L); //根据位序K,返回相应元素 
int Find(ElementType X,List L); //在线性表L中查找X第一次出现的位置 
void Insert(ElementType X,int i,List L); //在位序i前插入一个新元素X 
void Delete(int i,List L); //删除指定位序i的元素 
int Length(List L); //返回线性表L的长度 

基本操作的实现 

1.初始化:

List MakeEmpty()
{List PtrL;PtrL = (List)malloc(sizeof(struct LNode));PtrL->Last = -1;return PtrL;
}

创建一个空线性表并返回其指针。

2.查找

int Find(ElementType X,List PtrL)
{int i = 0;while(i <= PtrL->Last && PtrL->Data[i] != X)i++;if(i > PtrL->Last)   //如果没找到,返回-1return -1;elsereturn i;
}

 3.插入

void Insert(ElementType X,int i,List PtrL)
{int j;if(PtrL->Last == MAXSIZE - 1)    //表满,无法插入 {printf("表满\n");return ;}if(i < 1 || i > PtrL->Last+2)    //检查插入位置合法性 {printf("插入位置不合法\n");return ;}for(j = PtrL->Last;j >= i-1;j--)PtrL->Data[j+1] = PtrL->Data[j];PtrL->Data[i-1] = X;PtrL->Last++;
}

4.删除

void Delete(int i,List PtrL)
{int j;if(i < 1 || i > PtrL->Last + 1) //检查空表及删除位置的合法性 {printf("不存在第%d个元素\n",i);return ;}for(j = i;j < PtrL->Last;j++)PtrL->Data[j-1] = PtrL->Data[j];PtrL->Last--;
} 

三、应用举例

我们以多项式的存储为例:

要表示一元多项式

我们就需要分别存储每一项的次数 i 及其对应的系数 ,有时候需要知道其所含的项数(非零项)。

法1:顺序结构直接存储 我们可以用数组下标 i 表示次数,数组元素Arr[i] 表示该项系数:

而用一般数组存储的弊端就在于数组的下标是一定的,如果不含该次项,我们就只能在其对应的位置填0,并且如果想要知道这个多项式含有几个非零项就只能通过遍历来实现,但实质上我们只需要存储非零项的次数和系数 。

法2:顺序结构存储非零项 我们可以利用结构体数组,定义两个分量分别存储次数 i 和 系数  

这样就大大节省了存储所需的空间,我们只需要定义两个指针分别对应系数和指数两个数组,就可以在一个循环里表示出所有非零项,在对两个多项式运算时(加减乘除),只需要在遍历时对两个结构体表示指数的数组进行检查,构造一个新的结构数组表示运算结果即可。

struct P{int coef;  //存储系数coefficientint expon; //存储指数exponent
}P1[n];
//一个结构体是一个非零项
//数组P1[n]表示一个包含n个非零项的多项式P1

以上两种方法都是基于数组存储多项式这一线性结构的


例图及思路来源于浙江大学《数据结构》MOOC,该系列文章为题主学习课程的总结笔记

相关文章:

  • nodejs学习计划--(三)http协议和IP介绍
  • 户外用品一站式采购,一手优质货源,产品种类多,就在2024深圳户外展
  • pyDAL一个python的ORM(终) pyDAL的一些性能优化
  • 【QT+QGIS跨平台编译】之二:【zlib+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
  • Electron中苹果支付 Apple Pay inAppPurchase 内购支付
  • vue3中Fragment特性的一个bug,需要留意的注意事项
  • redis-exporter grafana面板配置
  • linux SSH/Telnet/Shell/CMD终端软件之WindTerm
  • 定时获取微博热搜数据
  • 《WebKit 技术内幕》之五(1): HTML解释器和DOM 模型
  • 深度学习模型之yolov8实例分割模型TesorRT部署-python版本
  • Dell戴尔XPS 8930笔记本电脑原装Win10系统 恢复出厂预装OEM系统
  • c JPEG 1D DCT 优化1
  • Camera基础原理与畸变补偿
  • Webpack5入门到原理22:提升打包构建速度
  • 【css3】浏览器内核及其兼容性
  • Babel配置的不完全指南
  • Flex布局到底解决了什么问题
  • JavaScript DOM 10 - 滚动
  • Redis字符串类型内部编码剖析
  • Shadow DOM 内部构造及如何构建独立组件
  • Spring核心 Bean的高级装配
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • XForms - 更强大的Form
  • 初识 beanstalkd
  • 聊聊directory traversal attack
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 前端面试之CSS3新特性
  • 王永庆:技术创新改变教育未来
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 一份游戏开发学习路线
  • 用mpvue开发微信小程序
  • ​configparser --- 配置文件解析器​
  • ​LeetCode解法汇总518. 零钱兑换 II
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (13)Hive调优——动态分区导致的小文件问题
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (区间dp) (经典例题) 石子合并
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (算法)Travel Information Center
  • (一)UDP基本编程步骤
  • (原)本想说脏话,奈何已放下
  • ******IT公司面试题汇总+优秀技术博客汇总
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .NET分布式缓存Memcached从入门到实战
  • .net流程开发平台的一些难点(1)
  • /proc/stat文件详解(翻译)
  • @Query中countQuery的介绍
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [ Linux Audio 篇 ] 音频开发入门基础知识