名词 | 意义 |
---|---|
DS(Data Strucuture) | 数据结构 |
ADT/Abstract Date Type | 抽象数据类型 |
List | 线性表 |
SeqList/SqList | 顺序表 |
LinkedList/LinkList/LIST | 链表 |
注:
(A为抽象、B为数据、T为类型)
ADT Complex{
①数据对象:
D={e1,e2| e1,e2∈RealSet}
②数据关系:
R={
③基本操作:
AssignComplex(&Z,V1, V2)
操作结果:构造复数Z,其实部和虚部分别被赋以参数V1和V2的值。
DestroyComplex(&Z)
操作结果:复数Z被销毁
GetReal(Z,&realPart)
初始条件:复数已存在。
操作结果:用realPart返回复数Z的实部值。
GetImag(Z,&ImagPart)
初始条件:复数已存在。
操作结果:用ImagePart返回复数Z的虚部值。
Add(Z1,Z2,&sum)
初始条件:Z1,Z2是复数
操作结果:用sum返回两个复数Z1,Z2的和值。}ADT Complex
ADT的数据特征:
数据抽象:用ADT描述程序处理的实体时,强调的是其本质的特征、其所能完成的功能以及它和外部用户的接口(即外界使用它的方法)。
数据封装:将实体的外部特征和内部实现细节分离,并且对外部用户隐藏其内部实现细节。
**
ADT抽象数据类型名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
}ADT 抽象数据类型名
(抽象数据类型需要通过固有具体类型来实现)
例:
//---存储结构的定义
typedef struct{
float realPart;//realPart实部
float imagPart;//imagPart虚部
}complex;
例:
//---基本操作的实现
Void add(complex Z1,complex Z2,complex &sum)
{ //以sum返回两个复数Z1、Z2的和
sum.realpart=Z1.realpart+Z2.realpart;
sum.imagpart=Z1.imagpart+Z2.imagpart;
}
/*Z1=a+bi;
*Z2=c+di;
*Z1+Z2=(a+b)+(c+d)i;
*/
顺序映像:以x的存储位置和y的存储位置之间某种关系表示逻辑大小
.
线性结构是一个数据元素的有序(次序)集,这是线性结构的基本特征
线性表是一种最简单的线性结构
线性表的类型定义即线性表的 抽象数据类型(ADT)定义,可以分为三个部分。
如图:
ADT List {
数据对象
D={ ai | ai ∈ ElemSet , i=1,2,…,n , n>=0 }
ElemSet 即 Element Set:元素集
{n为线性表的表长。
n=0时称为线性表为空表。}
数据关系
R1={< ai-1 , ai >|ai-1 , ai ∈ D(数据对象) , i=2,3,…,n}
注:< ai-1 , ai >即有序
设线性表为(a1,a2,…,ai,…,an),称i为ai在线性表中的位序。
注
:下标和位序是错位一个数字的!
} ADT List
结构初始化操作InitList(初始化即从无到有)
InitList(&L)
操作结果:
构造一个空的线性表L。
结构销毁操作DestoryList(销毁即从有到无)
DestoryList(&L)
操作结果:
销毁一个存在的线性表L。
引用型操作
以下七个操作均未对线性表L进行修改
1. ⭐ListEmty(L) 判断线性表L是否为空 返回值为布尔型
2. ⭐ListLength(L) 求线性表L长度
3. PriorElem(L,cur_e,&pre_e) 求线性表L中数据元素cur_e的前驱放入pre_e变量中
4. NextElem(L,cur_e,&next_e) 求线性表L中数据元素cur_e的下个元素放入变量next_e中
5. ⭐GetElem(L,i,&e) 取线性表L中第i个位置的元素放入变量e中
6. ⭐LocateElem(L,e,compare()) 取线性表L中满足compare()函数的元素e的元素位序
7. (非重要)ListTraverse(L,visist()) 遍历线性表L(常用于二叉树与图)
注:cur_e 数据元素(非数值);&next 后继
结点包含数据元素并且还包含一个或者多个指针
数据元素:
数据元素(data element)是计算机科学术语。它是数据的基本单位,数据元素也叫做结点或记录。在计算机程序中通常作为一个整体进行考虑和处理。有时,一个数据元素可由若干个数据项组成,例如,一本书的书目信息为一个数据元素,而书目信息的每一项(如书名、作者名等)为一个数据项。数据项是数据的不可分割的最小单位。
加工型操作⭐
以下操作均对线性表L进行了修改
1.ClearList(&L) (清空线性表L)
初始条件:线性表L已存在。
操作结果:将L重置为空表。
2.PutElem(&L,i,e)(修改线性表中第i个位序的元素为e)
初始条件:线性表L已存在且1<=i<=LenthList(L)
操作结果:L中第i个元素赋值同e的值。
3.ListInsert(&L,i,e) (在线性表L中第i个位序插入元素e)
初始条件:线性表L已存在,且1<=i<=LenthList(L)+1.。
操作结果:在L的第i个元素之前插入新的元素e,L的长度增1。
4.ListDelete(&L,i,&e) (线性表L中删除第i个位序的元素 并把元素赋给e)
初始条件:线性表L已存在且非空,1<=i<=LenthList(L)。
操作结果:删除L的第i个元素,并用e返回值,L的长度减1。
数组是顺序表的一种特例,其区别在于数组一般存储的是一些简单的数据类型,而顺序表可以是抽象的,可描述的。
#define MAXSIZE 100
//线性表存储空间的分配量,即数组长度
typedf struct
{ElemType elem[MAXSIZE];
int length;//当前长度
}SquList//俗称顺序表
typedef(类型转换)
ElemType(不是C语言合法关键字,代表这个算法可以处理任意数据类型的)
elem(用a、b也行或其它都行)
struct
{ElemType elem[MAXSIZE];
int length;//当前长度
}
这一块是结构体。
总体意思:用了typedef命令把结构体赋给了SqIist。
例:typedef int A
即可以用A a⇔int a
意思是:原来用int整型变量当用了typedef就是把整型变量的能力全部赋给了任意一个关键字A。