线性表的类型定义、顺序表示和实现
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
l 线性表的数学模型(形式定义):
l 含有n个数据元素的线性表是一个数据结构
l
LinearList=(A, R)
l 其中: A={ai| ai∈ElemType , 1≤i≤n, n≥0}
l
R={r}
l
r={<ai, ai+1> | 1≤i≤n -1}
说明:
l ①线性表的数据元素可以是各种类型(整、实、记录类型等 )
l 表示为:A=(a1,a2,… ,ai,ai+1,… ,an )
第i个元素的地址
l 假设线性表中有n个元素,每个元素占k个单 元,第一个元素的地址为loc(a1),则可以通过 如下公式计算出第i个元素的地址loc(ai): loc(ai) =loc(a1)+(i-1)×k
l 其中loc(a1)称为基地址。
l
typedef int ElemType;
l
typedef char ElemType;
l
等;
l ②同一线性表中的数据元素必须具有相同的特性,属同一类 型;
l ③a2,关…系, ra是i-1,一a个i, a有i+1序, …偶,对an的)集,合a,i-1即领对先于于非ai,空表的示线了性数表据(元a1,素 之;间的相邻关系,称ai-1是ai的直接前驱,ai是ai-1的直接后继
l
if (!locateElem(la,e,equal))
l
insertElem(la,e,la.size+1);
l}
l}
l int equal(ElemType e1,ElemType e2)
l{
l if (e1.id==e2.id)
l
return 1;
l return 0;
l}
算法的时间复杂度为O(La.size×Lb.size)。
int locateElem(&L,e,compare()); //返回L中第1个与e满足关系compare()的数据 元素的位序。若这样的数据元素不存在,则返回0
bool insertElem(&L, e, pos); //在L的pos位置插入e,线性表L长度加1
bool deleteElem(&L,pos); //删除L的第pos个数据元素
线性表的顺序存储结构示意图
顺序存储结构可以借助于高级程序设计语言中的一维数组来表示。
用C++语言描述的顺序表类型如下所示: sqlist.h
#include <iostream> using namespace std;
struct Node {
int id; int age; };
//定义结点(数据元素)的类型
l 这里的"有序"仅指在数据元素之间存在一个"领先"或"落后" 的次序关系,而非指数据元素"值"的大小可比性。比较典型 的线性结构:线性表、栈、队列、串等。
2.1 线性表的类型定义
2.1.1 线性表的定义
l 线性表(linear_list)是n个数据元素的有限序列,记作 (a1, a2, …, ai, …, an)。
typedef Node ElemType; //声明结点的类型名为ElemType
struct SqList
//定义线性表的存储结构
{
ElemType* list;
int size;
int maxSize;
};
bool initList(SqList& L,int ms); void clearList(SqList& L); int getSize(SqList L); bool isEmpty(SqList L); bool isFull(SqList L); void traverList(SqList L,void (*visit)(ElemType&)); ElemType& getElem(SqList L,int pos); int locateElem(SqList& L,ElemType e,int (*compare)(ElemType,ElemType)); int findList(SqList L,ElemType e); bool insertElem(SqList& L,ElemType e,int pos); bool deleteElem(SqList& L,int pos); bool createList(SqList& L,int n,void (*visit)(ElemType&));
bool createList(&L,n, visit ()); //创建有n个元素的线性表
}
2.1.3 操作举例
l 例:假设利用两个线性表La和Lb分别表示两 个集合A和B,求一个新的集合A=A∪B。
l 算法:
– ①取得Lb中的1个元素; – ②在La中查找这个元素; – ③若不存在:插入La中;若存在,取Lb中下一个
线性表的类型定义、顺 序表示和实现
2020年4月19日星期日
l 线性表是一种最简单的线性结构。
l 什么是线性结构?简单地说,线性结构是一个数据元素的有 序(次序)集合。它有四个基本特征:
l 在数据元素的非空有限集中,
– ①存在惟一的一个被称做"第一个"的数据元素; – ②存在惟一的一个被称做"最后一个"的数据元素; – ③除第一个之外,集合中的每个数据元素均只有一个前驱; – ④除最后一个之外,集合中的每个数据元素均只有一个后继。
l ④序列中数据元素的个数 n 定义为线性表的表长,n=0 时的 线性表被称为空表;
l ⑤称i为数据元素在线性表中的位序。
2.1.2 线性表的抽象数据类型
ADT LinearList { Data: 一个线性表L定义为L=(a1,a2,…,an),当L=( )时定义为一个空表 。 Operation: bool initList(& L); //初始化线性表L,即把它设置为一个空表 void clearList(& L); //将L重置为空表 int getSize(L); //返回L中数据元素的个数 bool isEmpty(L); //判断L是否为空,若空则返回true,否则返回false void traverList(L, visit( )); //遍历线性表L,依次对L的每个数据元素调用函数visit( ) ElemType& getElem(L, pos); //返回线性表第pos个数据元素的值
2.2 线性表的顺序表示和实现
2.2.1 线性表的顺序表示
l 线性表的顺序存储是指用一组地址连续的存 储单元依次存储线性表中的各个元素,使得 线性表中在逻辑结构上相邻的数据元素存储 在相邻的物理存储单元中,即通过数据元素 物理存储的相邻关系来反映数据元素之间逻 辑上的相邻关系。 采用顺序存储结构的线性 表通常称为顺序表。
元素,重复 ①、②、③,直到取完Lb的每个元素 。
l void unionList(SqList &la,SqList lb)
来自百度文库
l{
l int lbSize=getSize(lb);
l ElemType e;
l for (int i=1;i<=lbSize;++i)
l{
l
e=getElem(lb,i);
l 含有n个数据元素的线性表是一个数据结构
l
LinearList=(A, R)
l 其中: A={ai| ai∈ElemType , 1≤i≤n, n≥0}
l
R={r}
l
r={<ai, ai+1> | 1≤i≤n -1}
说明:
l ①线性表的数据元素可以是各种类型(整、实、记录类型等 )
l 表示为:A=(a1,a2,… ,ai,ai+1,… ,an )
第i个元素的地址
l 假设线性表中有n个元素,每个元素占k个单 元,第一个元素的地址为loc(a1),则可以通过 如下公式计算出第i个元素的地址loc(ai): loc(ai) =loc(a1)+(i-1)×k
l 其中loc(a1)称为基地址。
l
typedef int ElemType;
l
typedef char ElemType;
l
等;
l ②同一线性表中的数据元素必须具有相同的特性,属同一类 型;
l ③a2,关…系, ra是i-1,一a个i, a有i+1序, …偶,对an的)集,合a,i-1即领对先于于非ai,空表的示线了性数表据(元a1,素 之;间的相邻关系,称ai-1是ai的直接前驱,ai是ai-1的直接后继
l
if (!locateElem(la,e,equal))
l
insertElem(la,e,la.size+1);
l}
l}
l int equal(ElemType e1,ElemType e2)
l{
l if (e1.id==e2.id)
l
return 1;
l return 0;
l}
算法的时间复杂度为O(La.size×Lb.size)。
int locateElem(&L,e,compare()); //返回L中第1个与e满足关系compare()的数据 元素的位序。若这样的数据元素不存在,则返回0
bool insertElem(&L, e, pos); //在L的pos位置插入e,线性表L长度加1
bool deleteElem(&L,pos); //删除L的第pos个数据元素
线性表的顺序存储结构示意图
顺序存储结构可以借助于高级程序设计语言中的一维数组来表示。
用C++语言描述的顺序表类型如下所示: sqlist.h
#include <iostream> using namespace std;
struct Node {
int id; int age; };
//定义结点(数据元素)的类型
l 这里的"有序"仅指在数据元素之间存在一个"领先"或"落后" 的次序关系,而非指数据元素"值"的大小可比性。比较典型 的线性结构:线性表、栈、队列、串等。
2.1 线性表的类型定义
2.1.1 线性表的定义
l 线性表(linear_list)是n个数据元素的有限序列,记作 (a1, a2, …, ai, …, an)。
typedef Node ElemType; //声明结点的类型名为ElemType
struct SqList
//定义线性表的存储结构
{
ElemType* list;
int size;
int maxSize;
};
bool initList(SqList& L,int ms); void clearList(SqList& L); int getSize(SqList L); bool isEmpty(SqList L); bool isFull(SqList L); void traverList(SqList L,void (*visit)(ElemType&)); ElemType& getElem(SqList L,int pos); int locateElem(SqList& L,ElemType e,int (*compare)(ElemType,ElemType)); int findList(SqList L,ElemType e); bool insertElem(SqList& L,ElemType e,int pos); bool deleteElem(SqList& L,int pos); bool createList(SqList& L,int n,void (*visit)(ElemType&));
bool createList(&L,n, visit ()); //创建有n个元素的线性表
}
2.1.3 操作举例
l 例:假设利用两个线性表La和Lb分别表示两 个集合A和B,求一个新的集合A=A∪B。
l 算法:
– ①取得Lb中的1个元素; – ②在La中查找这个元素; – ③若不存在:插入La中;若存在,取Lb中下一个
线性表的类型定义、顺 序表示和实现
2020年4月19日星期日
l 线性表是一种最简单的线性结构。
l 什么是线性结构?简单地说,线性结构是一个数据元素的有 序(次序)集合。它有四个基本特征:
l 在数据元素的非空有限集中,
– ①存在惟一的一个被称做"第一个"的数据元素; – ②存在惟一的一个被称做"最后一个"的数据元素; – ③除第一个之外,集合中的每个数据元素均只有一个前驱; – ④除最后一个之外,集合中的每个数据元素均只有一个后继。
l ④序列中数据元素的个数 n 定义为线性表的表长,n=0 时的 线性表被称为空表;
l ⑤称i为数据元素在线性表中的位序。
2.1.2 线性表的抽象数据类型
ADT LinearList { Data: 一个线性表L定义为L=(a1,a2,…,an),当L=( )时定义为一个空表 。 Operation: bool initList(& L); //初始化线性表L,即把它设置为一个空表 void clearList(& L); //将L重置为空表 int getSize(L); //返回L中数据元素的个数 bool isEmpty(L); //判断L是否为空,若空则返回true,否则返回false void traverList(L, visit( )); //遍历线性表L,依次对L的每个数据元素调用函数visit( ) ElemType& getElem(L, pos); //返回线性表第pos个数据元素的值
2.2 线性表的顺序表示和实现
2.2.1 线性表的顺序表示
l 线性表的顺序存储是指用一组地址连续的存 储单元依次存储线性表中的各个元素,使得 线性表中在逻辑结构上相邻的数据元素存储 在相邻的物理存储单元中,即通过数据元素 物理存储的相邻关系来反映数据元素之间逻 辑上的相邻关系。 采用顺序存储结构的线性 表通常称为顺序表。
元素,重复 ①、②、③,直到取完Lb的每个元素 。
l void unionList(SqList &la,SqList lb)
来自百度文库
l{
l int lbSize=getSize(lb);
l ElemType e;
l for (int i=1;i<=lbSize;++i)
l{
l
e=getElem(lb,i);