线性表——顺序表
绪论什么的就直接过吧。
线性表的定义
线性表是具有相同特性的数据元素的一个有限序列(官方定义),事实上就是讲一堆具有相同特性可以称之为一类的数据元素排列在一个单一的线性的结构中。
该序列中所含元素的个数叫线性表的长度(有人可能会觉得这是废话,然而大家如果学过图和树就知道为什么要在定义这里着重的提一下这个概念)。
线性表的抽象数据类型描述
主要是需要大家了解一下,线性表中的一些基本运算:
InitList(&L):初始化线性表,构造一个空的线性表L
DestroyList(&L):销毁线性表,释放线性表L占用的内存空间
ListEmpty(L):判断线性表是否为空表,若L为空表,则返回真,否则返回假
ListLength(L):求线性表的长度,返回L中元素的个数
DispList(L):打印线性表,当线性表L不为空时顺序显示L中各结点的值域(即L每个空间存放的元素值)
GetElem(L,i,&e):求线性表中的某个数据元素值,用e返回L中第i个元素的值
LocateElem(L,e):按元素值查找,返回L中第一个值域与e相等的元素的序号,若这样的元素不存在,则返回值为0
(就是在线性表中找第一个与e相等的元素的序号)
ListInsert(&L,i,e):插入数据元素e,在L的第i个位置插入一个新的元素
ListDelete(&L,i,&e):删除数据元素e,删除L的第i个元素,并用e来返回其值
老师当时用了一节课的时间解释&的含义,就是引用传递。具体的原理我也说不明白,我个人一直就是按照,在函数中使用引用传递,函数中这个参数的变化在函数之外仍然有效,这么理解的。
(事实上我还看到过这个&做复制的作用在动态规划中用来减少参数名称的长度)
顺序表
顺序表就是线性表的顺序存储结构的简称,即将线性表中所有的元素按照其逻辑顺序一次存储到从计算机存储器中指定存储位置开始的一块连续的存储空间中。
一般在C/C++语言中,就是用数组类型来实现顺序表,数组大小记作 MaxSize,一般定义为一个整型常量(或者宏)。
#define MaxSize 50
书上是用结构体SqList来表示一个线性表,结构体中的成员变量data[MaxSize]即为线性表中的所有元素,另一个成员变量length表示线性表的实际长度。
//data表示元素的值,length表示序列长度,ElemType表示存储的元素类型
struct SqList{
ElemType data[MaxSize]; int length;};
顺序表基本运算的实现
这里为了方便起见,存储的元素类型默认为int类型。
建立顺序表
这个建立不是初始化,而是整体建立一个顺序表,相当于原本就有个a数组,将它按照顺序表结构体的方式存储起来:
//建立顺序表
void CreateList(SqList*& L,ElemType a[],int n){
L=(SqList*)malloc(sizeof(SqList));//光有指针不够,还有给指针开辟空间
//讲道理这里用new不好么?反正你都是C和C++混用的代码了
for (int i=0;i<n;i++) L->data[i]=a[i]; L->length=n;//一一赋值
}
初始化线性表
这个运算和上面的区别,就相当于初始化和搬运的区别,初始化了一个长度为0的空顺序表:
//初始化线性表
void InitList(SqList*& L){
L=(SqList *)malloc(sizeof(SqList)); L->length=0;}
也不用放东西进去,简简单单没有脑袋。
销毁线性表
注意这个叫销毁,而不是清空。清空顺序表只是将length值改为0,销毁是释放顺序表占据的内存(这个区别大家稍微体会一下就能感觉到相当之大):
//销毁线性表
void DestroyList(SqList *&L){
free(L);}//free(指针),代表释放指针指向的空间
判断线性表是否为空
就是判断length是否为0:
//判断线性表是否为空
bool ListEmpty(SqList* L){
return(L->length==0);}
输出线性表长度
返回length:
//求线性表的长度
int ListLength(SqList* L){
return(L->length);}
输出线性表
根据length,循环打印咯:
//输出(打印)线性表
void DispList(SqList* L){
for (int i=0;i<L->length;i++) printf("%d ",L->data[i]);