DataStructure之线性表以及其实现
线性表
应用:多项式的表示
什么是线性表
多项式表示问题给出的启示:
同一个问题可以有不同的表示(存储)方法
有一类共性问题 : 有序线性序列的租住和管理
“线性表(Linear List)” : 由同类型数据元素构成有序序列的线性结构
表中元素个数称为线性表的长度
线性表没有元素时,称为空表
表起始位置称为表头,表结束位置称为表尾
线性表的抽象数据类型描述
类型名称 : 线性表(List)
数据对象集: 线性表是 n(>=0) 个元素构成的有序序列(a_1, a_2, a_3, ...., a_n)
操作集: 线性表L属于List, 整数i表示位置, 元素X属于ElementType
线性表基本操作主要有:
List MakeEmpty(): 初始化一个空性表L;
ElementType FindKth(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的长度n;
线性表的顺序存储实现
利用数组的连续存储空间顺序存放线性表的各元素

#define MAXSIZE <............>
typedef struct LNode *List;
struct LNode{
ElementType Data[MAXSIZE];
int Last;
};
struct LNode L;
List PtrL;
访问下标为i的元素:L.Data[i] 或 PtrL->Data[i]
线性表的长度: L.Last+1 或PtrL->Last+1
主要操作的实现
初始化(建立空的顺序表)
List MakeEmpty()
{
List PtrL;
PtrL = ( List )malloc( sizeof( struct LNode ) );
PtrL->Last = -1;
return PtrL;
}
查找
int Find(ElementType K, List PtrL)
{
int i = 0;
while( i <= PtrL->Last && PtrL->Data[i] != X)
i++;
if( i > PtrL->Last) return -1; //如果没有找到, 返回-1
else return i;//找到后返回的是存储位置
}
插入(第 i (1 <= i <= n+1)个位置上插入一个值为X的新元素)
这里的要注意的是, 这里的代码是采用的从1开始计数的设计

插入操作的具体实现
需要注意这里的是, 这里的位置是从1开始计数(就是人类默认的第一位置的元素就是第一个,对于计算机中来说,还可以有从0开始计数,普遍的来说,在计算机中大都是从0开始计数的)
void Insert ( ElementType X, int i, List PtrL)
{
int j;
if ( PtrL->Last == MAXSIZE - 1){ //表的空间已满, 不能插入新的元素(这里的MAXSiZE - 1是能插入进去的最后的一个位置, 而MASIZE代表的是表中元素最多的元素个数)
printf ( " 表满 ");
return ;
}
if ( i < 1 || i > PtrL->Last+2){
/*对于 PtrL->Last 表示的数链表中数组元素的最后一个元素的位置信息(这里的位置信息时采用从0开始计数的),因此要是采用从1开始计数的话,这个位置就是第PtrL->Last + 1 位置上的元素, 但是要插入元素的范围是在(1 <= i <= n+1) 即, 第一位置开始, 到第n + 1位置开始, 因此这里的最后一个位置要插入的位置(第n+1位置)用PtrL->Last表示的话就是PtrL->Last + 2位置,
所以这里判断的i 的范围,就可以很容易的知道这里的范围的含义。*/
printf ( " 位置不合法 ");
return;
}
for ( j = PtrL->Last; i >= i - 1; j--)
PtrL->Data[j + 1] = PtrL->Data[j];//将a_i .... a_n 倒序向后移动
PtrL->Data[i - 1] = X;//新元素插入
PtrL->Last++;//Last仍指向最后元素
return;
}
//插入的另一个版本, 这里采用的计数就是在0开始进行计数的
void Insert(List L, Elementype X, Position P)
删除(删除表的第 i (1 <= i <=n)个位置上的元素)

删除操作的实现 (这里也是有位置计数的为题,下面这个采用的是从第1个位置开始计数的)
void Delete( int i, List PtrL)
{
int j;
if ( i < 1 || i > PtrL->Last + 1){
printf ( "不存在第%d个元素", i);
return;
}
for ( j = i; j <= PtrL->Last; j++)
PtrL->Data[j - 1] = PtrL->Data[j];//将a_(i+1) ..... a_n顺序向前移动
PtrL->Last--;//Last仍指向最后元素
return ;
}
//这里采用的计数位置是从0开始计数的
完整测试代码:
/*list_array.c*/
编译运行:
insert success
insert success
insert success
insert success
insert success
insert success
insert success
insert success
insert success
insert success
insert success
10 9 8 7 6 5 4 3 2 1 0
this list length : 11
the positon 2 is : 0
——————————————————————————————————线性表的顺序存储———————————————————————————————————
DataStructure之线性表以及其实现的更多相关文章
- C#实现数据结构——线性表(下)
线性表链式存储结构 看了线性表的顺序存储,你肯定想线性表简是挺简单,但是我一开始怎么会知道有多少人排队?要分配多大的数组?而且插入和删除一个元素也太麻烦了,所有元素都要前移/后移,效率又低. 那怎么办 ...
- 线性表的顺序存储结构之顺序表类的实现_Java
在上一篇博文——线性表接口的实现_Java中,我们实现了线性表的接口,今天让我们来实现线性表的顺序存储结构——顺序表类. 首先让我们来看下顺序表的定义: 线性表的顺序存储是用一组连续的内存单元依次存放 ...
- 线性表接口的实现_Java
线性表是其组成元素间具有线性关系的一种线性结构,对线性表的基本操作主要有插入.删除.查找.替换等,这些操作可以在线性表的任何位置进行.线性表可以采用顺序存储结构和链式存储结构表示. 本接口的类属于da ...
- 线性表Linearlist
顺序存储,链式存储,索引存储,散列存储 基本运算 SLIST 1.置空表 void SetNull(&L) 2.求长度 int Length(L) 3.取元素 ...
- 数据结构(Java描述)之线性表
基础概念 数据结构:是相互之间存在一种或多种关系的数据元素的集合. 逻辑结构和物理结构 关于数据结构,我们可以从逻辑结构和物理结构这两个维度去描述 逻辑结构是数据对象中数据元素之间的关系,是从逻辑意义 ...
- JAVASE02-Unit04: 集合框架 、 集合操作 —— 线性表
Unit04: 集合框架 . 集合操作 -- 线性表 操作集合元素相关方法 package day04; import java.util.ArrayList; import java.util.Co ...
- 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。
//归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...
- Java集合类学习笔记(各种线性表性能分析)
ArrayList.LinkedList是线性表的两种典型实现:基于数组的线性表和基于链的线性表. Queue代表了队列,Deque代表了双端队列. 一般来说,由于数组以一块连续内存区来保存所有的数组 ...
- 动态分配的顺序线性表的十五种操作—C语言实现
线性表 定义:是最常用的,也是最简单的数据结构,是长度为n个数据元素的有序的序列. 含有大量记录的线性表叫文件 记录:稍微复杂的线性表里,数据元素为若干个数据项组成,这时把一个数据元素叫记录 结构特点 ...
随机推荐
- Java获取两个日期之间的所有日期集合
1.返回Date的list private List<Date> getBetweenDates(Date start, Date end) { List<Date> resu ...
- Could not calculate build plan :lugin org.apache.maven.plugins:maven-resources-plugin:2.6 or one of
eclipse中新建maven项目,出现 Could not calculate build plan :lugin org.apache.maven.plugins:maven-resources- ...
- Vue中的slot(占坑,预留位置)
Vue中的slot(占坑,预留位置) 子模板不使用slot 子模板使用slot 子模板使用使用name属性,且传递data 文件名:Slots.vue //slot组件 <template> ...
- 使用Quarkus在Openshift上构建微服务的快速指南
在我的博客上,您有机会阅读了许多关于使用Spring Boot或Micronaut之类框架构建微服务的文章.这里将介绍另一个非常有趣的框架专门用于微服务体系结构,它越来越受到大家的关注– Quarku ...
- android 多行 RadioButton的使用
最近项目用到了多行RadioButton,随记录下. 先给出RadioButton的布局 <com.kuibu.jucai.widget.MyRadioGroup android:id=&quo ...
- Java线程常见面试题
v 多线程实现手段: (1).继承Thread类 (2)实现Runable接口 (3)使用线程池 v 线程控制在那个包:java.util.concurrent. (1)提供了线程的运行.(2)线程池 ...
- charles DNS欺骗
本文参考:charles DNS欺骗 DNS欺骗/DNS Spoofing 功能:通过将您自己的主机名指定给远程地址映射来欺骗DNS查找 一般的开发流程中,在上线之前都需要在测试环境中先行进行验证,而 ...
- centos7 supervisor管理redis
centos7 supervisor管理redis 标签(空格分隔): linux,redis 概念 Supervisor 相当强大,提供了很丰富的功能,不过我们可能只需要用到其中一小部分 super ...
- [Leetcode] 第309题 最佳买卖股票时机含冷冻期
一.题目描述 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 . 设计一个算法计算出最大利润.在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票): 你不能同时参与 ...
- java处理emoji(转)
最近对接ios.安卓客户端,需要处理emoji等表情符号,网上总结: 1.过滤掉emoji表情符 2.修改数据库的编码格式等,让其支持存储emoji 以下分别对两种方案进行描述: 第一种:过滤掉emo ...