数据结构之线性表
时间:2022-04-26
本文章向大家介绍数据结构之线性表,主要内容包括基本概念、线性表抽象数据类型、线性表的存储结构、线性表的基本操作、删除操作、查询操作、顺序表需要预分配一定长度的存储空间,不能动态增长,插入或删除比较麻烦。基于线性表的缺点,有了链式存储线性表。链式存储的特点:、线性表查询、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
基本概念
线性表(List):由零个或多个数据元素组成的有限序列。
特征:
1.线性表是一个序列。
2.0个元素构成的线性表是空表。
3.线性表中的第一个元素无前驱,最后一个元素无后继,其他元素有且只有一个前驱和后继。
4.线性表是有长度的,其长度就是元素个数,且线性表的元素个数是有限的,也就是说,线性表的长度是有限的。
线性表抽象数据类型
基于线性表的特征,线性表可以做如下操作:
- InitList(*L);//初始化操作,建立一个空的线性表
- ListEmpty(L);//若线性表为空,返回true,否则返回false
- ClearList(*L);//清空线性表
- GetElem(L,i,*e);//查找线性表中的第i个位置的元素值,并赋值给e
- LocateElem(L,e);//查找线性表L中与给定值e相等的元素,如果查找成功,则返回第一个相同的元素在L //中的下标;否则,返回0表示失败
- ListInsert(*L,i,e);//在线性表L的第i个位置插入元素e
- ListDelete(*L,i,*e);//删除线性表L中第i个位置元素,并用e返回其值
- ListLength();//返回线性表L的长度
线性表和线性表可以进行叠加操作,线性表La和线性表Lb的并集操作,结果保存在La中的伪代码如下:
//实现线性表La和线性表Lb的并集操作,结果保存在La中
void UnionList(*La,Lb)
{
//计算Lb长度
int lblength = ListLength(Lb);
//计算La长度
int laLength = ListLength(La);
int i ;
//便利Lb中所有元素,判断其是否在La中,若不在,则插入La中
for (i=0;i<length;i++)
{
ElemType temp = GetElem(Lb,i,*e);
if (LocateElem(La,temp)==0)
{
ListInsert(La,++laLength,temp);
}
}
}
线性表的存储结构
根据其字面意思,线性表是顺序存储的,用一段地址连续的存储单元依次存储线性表的数据元素。
如:
#define MAXSIZE 20;//存储空间初始分配量为20
typedef int ElemType;//数据类型为int
type struct
{
ElemType data[MAXSIZE];//数组存储数据元素
intlength;//线性表长度
};
关于线性表地址长度的计算
由于顺序存储结构是按照顺序存储的,所以每个数据元素的地址都可以根据第一个元素的地址推算出来。其计算公司LOC(ai) = LOC(a1)+ (i-1)*c
线性表的基本操作
线性表基本操作包含基本的CRUD操作。
插入操作
插入操作算法的思路是: 1.如果插入位置不合理,抛出异常。 2.如果线性表长度大于等于数组长度,则抛出异常或者增加数组长度。
例如:在线性表L的第i个位置插入元素e
int ListInsert(Sqlist *L, int i, ElemType e) {
//插入位置错误,返回0
if (i < 0 || i > L.Length)
{
return 0;
}
//线性表的长度大于等于数组的最大长度,返回0
if (L.Length >= MAXSIZE)
{
return 0;
}
int j = L.Length -1;
//从第i个元素到最后一个元素,每个元素后移一位
while (j >= i)
{
L.data[j+1] = L.data[j];
j--;
}
//第i个元素的位置放入e
L.data[i] = e;
//线性表长度加1
L.Length ++;
}
删除操作
删除操作的思路是: 1.如果删除位置不合理,抛出异常 2.取出删除元素 3.从删除位置开始遍历到最后一个元素,分别将她们都向前移动一个位置 4.表长减1
例如:我们要删除一个线性表的某一个元素
int ListDelete(SqList *L,int i,ElemType *e) {
//如果删除的位置不对,则返回0
if (i < 0 || i > L.Length -1)
{
return 0;
}
*e = L.data[i-1];
for (j = i-1;i <L.Length-2;j++ )
{
L.data[j] = L.data[j+1];
}
L.Length --;
return 1;
}
查询操作
查询操作是比较简单的,例如:我们要在线性表中查询某个元素的位置。
int GetElem(SqList L,int i, ElemType * e)
{
//线性表长度等于0或者获取元素位置错误返回0
if (L.Length == 0 || i < 0 || i > L.Length)
{
return 0;
}
返回第i个元素
*e = L.data[i-1];
return 1;
}
线性表的缺点
顺序表需要预分配一定长度的存储空间,不能动态增长,插入或删除比较麻烦。基于线性表的缺点,有了链式存储线性表。链式存储的特点:
typedef struct Node
{
ElemType data;
struct Node *next;
} Node;
typedef struct Node *LinkList;
线性表查询
算法思路是: 1.声明一个节点p指向链表第一个节点,初始化j从1开始 2.当j< i时,就遍历链表,让P的指针向后移动,不断指向下一个节点,j累加1 3.若到链表末尾p为空,则说明第i个元素不存在 4.否则查找成功,返回节点p的数据
int GetElem(LinkList L,int i,ElemType *e)
{
int j;
LinkList p;
p = L->next;//p指向链表第一个节点
while (p && j < i )
{
p = p->next;
j++;
}
if(!p || count > i)
return 0;
*e = p->data;
return 1;
}
- tensorflow之tf.placeholder 与 tf.Variable区别对比
- 11g备库搭建碰到自己给自己埋的坑(r7笔记第63天)
- JDBC基础入门(2)
- 11g备库无法开启ADG的原因分析 (r7笔记第62天)
- JDBC基础入门(3)
- Python多元线性回归-sklearn.linear_model,并对其预测结果评估
- python 聚类分析实战案例:K-means算法(原理源码)
- JAVA面试题解惑——final、finally和finalize的区别
- Java内存管理
- python基础知识——内置数据结构(字典)
- mysql、mongodb、python(dataframe).聚合函数的形式,以及报错解决方案
- JavaScript计算水仙花数【可自定义范围】
- JSP简单入门(1)
- mongodb取出json,利用python转成dataframe(dict-to-dataframe)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Golang中的RegExp正则表达式用法指南
- Golang glog使用详解
- kubernetes使用securityContext和sysctl
- 浅谈分词算法基于字的分词方法(HMM)
- 优雅的重启服务
- Go defer 会有性能损耗,尽量不要用?
- 带入gRPC:分布式链路追踪 gRPC + Opentracing + Zipkin
- 聊聊Golang逃逸分析
- 结构型设计模式:适配器模式和门面模式
- 结构型设计模式:代理模式
- kubernete中的原子调度单位:pod
- mybatis-generator在命令行及IEAD中的使用
- mybatis-generator在命令行及IDEA中的使用
- 70-STM32+ESP8266+AIR202基本控制篇-移植使用-移植单片机MQTT底层包到自己的工程项目
- springboot研究:springboot自带监控actuator