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个数据元素的有序的序列. 含有大量记录的线性表叫文件 记录:稍微复杂的线性表里,数据元素为若干个数据项组成,这时把一个数据元素叫记录 结构特点 ...
随机推荐
- 2019沈阳网络赛B.Dudu's maze
https://www.cnblogs.com/31415926535x/p/11520088.html 啊,,不在状态啊,,自闭一下午,,都错题,,然后背锅,,,明明这个简单的题,,, 这题题面不容 ...
- Google工程师亲授 Tensorflow2.0-入门到进阶
第1章 Tensorfow简介与环境搭建 本门课程的入门章节,简要介绍了tensorflow是什么,详细介绍了Tensorflow历史版本变迁以及tensorflow的架构和强大特性.并在Tensor ...
- Redis集群的离线安装以及原理理解
一.本文主要是记录一下Redis集群在linux系统下离线的安装步骤,毕竟在生产环境下一般都是无法联网的,Redis的集群的Ruby环境安装过程还是很麻烦的,涉及到很多的依赖的安装,所以写了一个文章来 ...
- 定义一个Person类,其中包括:1.定义属性:姓名、年龄、民族作为成员变量。定义静态成员变量:人数2.定义构造方法:对成员变量进行初始化。3.定义多个方法:分别显示相应的属性值,例如getName(){System.out.print("名称="+name+";"); }4.定义一个方法“成长”:实现年龄的增加,每执行一次年龄增加1
题目显示不全,完整题目描述: (1)定义一个Person类,其中包括:1.定义属性:姓名:年龄:民族作为成员变量.定义静态成员变量:人数2.定义构造方法:对成员变量进行初始化.3.定义多个方法:分别显 ...
- 如何更规范化使用MySQL
如何更规范化使用MySQL 背景:一个平台或系统随着时间的推移和用户量的增多,数据库操作往往会变慢:而在Java应用开发中数据库更是尤为重要,绝大多数情况下数据库的性能决定了程序的性能,如若前期埋下的 ...
- JavaScript之时间对象Date
时间是物理学七大常量之一.生活中记录时间有两种方式(或者说有两种计时系统):GMT(格林尼治时间)和UTC(协调世界时间). 一 创建Date对象 JS中的Date对象只能通过new关键字创建. va ...
- JAVA设计模式---总述篇
一.设计模式(Design Pattern): 1.设计模式的概念 是前辈们对代码开发经验的总结,是解决特定问题的一系列套路.它不是语法规定,而是一套用来提高代码可复用性.可维护性.可读性.稳健性以及 ...
- 构建之法——homework1:问题思考
1.我看了第一章概论,1.2.4 软件工程的目标——创造“足够好”的软件,其中提到了什么是好的软件? 软件工程的一个要素就是把软件的Bug都消灭掉的过程. 提问:我们知道Bug是不可能完全消灭掉的, ...
- python实现感知机线性分类模型
前言 感知器是分类的线性分类模型,其中输入为实例的特征向量,输出为实例的类别,取+1或-1的值作为正类或负类.感知器对应于输入空间中对输入特征进行分类的超平面,属于判别模型. 通过梯度下降使误分类的损 ...
- uni-app实现滑动切换效果
在对于uni-app框架了解之后,今天就实现一个滚动切换tab效果,这个很常见的一个效果,最后封装成一个组件,便于以后使用,写这个需要引入uni官方提供的uni.css样式,用到了写好的样式,就不需要 ...