文章目录
线性表
1.1线性表的定义和特点
线性表是具有相同特性的数据元素的一个有限序列
-
序列的第一个结点叫做起始结点(线性起点)、最后一个结点叫做终端节点(线性重点)
-
每个元素都至少有一个直接前趋或直接后继
-
当n= 0 时,该线性表叫做空表
-
结点是从a1到an(下角标从1开始)
1.2 案例引入
一元多项式的计算:实现两个多项式加、减、乘运算
面对稀疏多项式,我们将指数和系数绑定在一个数组当中组成一个数据元素
稀疏多项式的加法的实现思路
- 顺序储存结构存在问题
- 储存空间分配不灵活
- 运算的空间复杂度高
- 因此,我们可以使用链式存储结构
图书管理系统
可以分析出也是用数组来作为数据元素存储信息,可以用顺序表,也可以用链表
总结
- 线性表中的数据元素的类型可以是简单类型,也可以是复杂类型
- 许多实际问题所设计的基本操作有很大的相似性
- 从具体的应用中抽象出共性的逻辑结构和基本操作(抽象数据类型),然后实现其储存结构和基本操作
1.3 线性表的类型定义
- 抽象数据类型线性表定义如下:
基本操作介绍
-
InitList(& L)
- 操作结果:构造一个空的线性表
-
DestroyList(& L)
- 初始条件:线性表L已经存在
- 操作结果:销毁一个线性表
-
ClearList(& L)
- 初始条件:线性表L已经存在
- 操作结果:将该线性表置为空表
-
ListEmpty(L)
- 初始条件:线性表L已经存在
- 操作结果:若是空表,则返回TRUE,否则返回FALSE
-
ListLength(L)
- 初始条件:线性表L已经存在
- 操作结果:返回L的数据元素的个数
-
GetElem(L,i,&e)
- 初始条件:线性表L已经存在,1<=i<=ListLength(L)
- 操作结果:用e返回线性表L中第i个数据元素的值
-
LoacateElem(L,e,compare())
- 初始条件:线性表L已经存在,compares()是数据元素的判定元素
- 操作结果: 返回L中第1个与e满足compare()的数据元素的位序.若这样的数据元素不存在则返回值为0
-
ListInsert(&L,i,e)
- 初始条件:线性表L已经存在,1<=i<=ListLength(L)
- 操作结果:在L的第i个位置前插入一个新的数据元素e,并且使L的长度加一
-
ListDelete(&l.i,&e)
- 初始条件:线性表L已经存在,1<=i<=ListLength(L)
- 操作结果:删除数组第i个数据元素,并用e返回其值,L的长度减一
-
ListTraverse(&L,visited())
- 初始条件:线性表L已经存在
- 对L的每一个元素调用visited()
-
以上提及的运算时逻辑结构上定义的运算,我们先不考虑如果做,带我们确定了存储结构之后再考虑
- 2.4 顺序表实现
- 2.5 链表实现
1.4 顺序表的表示和实现
顺序储存结构的定义
- 把逻辑上相邻的数据元素储存在物理上相邻的储存单元中(地址连续)的存储结构
- 顺序表长度可变
好处:
- 知道了某个元素的地址值,那么很容易就能够找出剩余元素的位置
- 任一元素均可随机存取
TIPS:
- 表的第一个元素的地址叫做基地址
- 我们可以用一维数组来表示线性表(但是c语言中的一维数组数组长度不可动态定义)
- 解决方法:我们用一个变量表示顺序表的长度属性
- 逻辑位序和物理位序相差1
- 动态数组和静态数组的实现方式都是可以的
定义模板
#define LIST_INIT_SIZE 100
typedef struct{
ElemType *elem[LIST_INIT_SIZE];//数据元素的基地址,加*号就是数组的动态分配,不加就是静态分配
int length;//当前长度
}SqList
多项式线性表的定义:
类c语言的相关补充
-
ElemType只是一个抽象概念,什么数据类型都可以 ,自定义的类型也可以
-
ElemType elem[LIST_INIT_SIZE]; //数据元素的基地址,加*号就是数组的动态分配,不加就是静态分配
-
静态分配:不加*号就是初始给你的数组分配基地址,这样所有元素的地址就没有改变了
-
动态分配:我们要手动为这个数组分配空间,语法如下:
-
SqList L; L.data = (ElemType*)malloc(sizeof(ElemType)*LIST_INIT_SIZE);
-
-
相关函数说明
- malloc(m)函数: 开辟m字节长度的地址空间,并返回这段空间的首地址,决定空间如何分配的是malloc函数前面小括号里面的类型
- free§函数:释放指针p所指向变量的储存空间,即彻底删除一个变量
- 前两个函数需要加载头文件<stdlib.h>
当然,c++,