一、线性表的概念
线性表是n个具有相同数据类型的n个有限数据元素的集合,我们把集合的长度称为线性表的表长,其中除了第一个元素(只有一个直接后驱元素)跟最后一个元素以外,其他数据元素都有一个直接前驱元素跟一个直接后驱元素。
二、线性表的基本操作
InitList(&L):
初始化一个线性表,其中“&”是C++中的引用符,跟C语言中的指针效果一样。
ListInsert(&L , i , e):
向线性表L中的第i个位置插入一个值为e的元素。
ListDelete(&L , i , e):
删除线性表L中第i个位置的元素,并用e返回。
Empty(L):
判断线性表L是否为空。
GetElem(L, i):
按位查找线性表L中第i个元素,如果有则返回其位序,没有返回空。
LocateElem(L,e):
按值查找线性表L中与给定关键字e相等的元素。
Length(L):
求线性表的表长,并返回表长。
PrintList(L):
打印/输出线性表L。
三、顺序表
学习一个数据结构应该从三个方面去学习:逻辑结构、存储结构、算法分析。
1.逻辑结构与物理结构:顺序表也是一种线性表,它是利用一组地址连续的存储单元来依次存储线性表中的数据元素,从而使得表中逻辑上相邻的两个元素在物理位置上也相邻,的第1个元素存储在顺序表的起始位置,然后依次向后存储1.2.3.4.......i.....n。其中i是元素a在顺序表中的位序。
顺序表的存储方式利用数组实现,分为:静态分配和动态分配。由于顺序表是利用数组进行存储,所以要注意数组下标与顺序表的位序(数组下标从0开始,线性表中元素的位序从1开始)。
2.算法分析:
(1)顺序表的定义:
静态分配存储结构
#define Maxsize 10 //表最大长度
typrdef struct {
Elemtype data[MaxSize]; //一维数组实现,存储元素
int length; //表长
}SqList; //类型定义
动态分配存储结构
#define InitSize 100 //表初始最大长度
typrdef struct {
Elemtype *data; //指针
int MaxSize length; //数组的最大长度 当前数组中的元素个数
}SqList; //类型定义
(2)基本操作的实现:
(1)初始化
静态分配存储实现:只需要将 length 的值赋值为0就可以了;
void InitList(SqList &L)
{
Length = 0; //表长为0
}
动态分配存储实现:实质上是当初始分配的空间存储满了之后,开辟一块新的存储空间,然后将原来表中的数据复制过去,然后释放原来那一片存储空间。
void InitList(SqList &L)
{
L.data = (Elemtype *)malloc(sizeof(Emletype)*InitSize); //malloc函数开辟空间用指针存储地址
MaxSize = InitList; //最大存储空间为初始值
Length = 0; //表长为0
}
(2)插入操作
在顺序表的第i(1<=i<=L.length + 1)个位置,插入新元素e,需判断插入的位置是否合法,若合法则需要将i之后的元素向后移动一个位置。(线性表中元素的位序从1开始)
bool ListInsert(SqList &L,int i,Elemtype e)
{
if(i<1 || i>L.length + 1) //判断插入位序是否合法
{
return false;
}
if(L.length >= MaxSize) //判断是否已经存满
{
return false;
}
for(int j=L.length ; j>=i ; j++) //i与i之后的元素向后移动一个位置
{
L.data[j] = L.data[j - 1];
}
L.data[i] = e; //插入新元素
L.length ++; //表长加一
return true;
}
(3)删除操作
与插入操作一样,需要判空、位序是否合法,与插入不同的是,删除元素后,第i个元素之后的元素都要向前移动一个位置
bool ListDeletd(SqList &L,int i,Elemtype e)
{
if(i<1 || i>L.length) //判断插入位序是否合法
{
return false;
}
if(L.length == 0 ) //判空
{
return false;
}
e = L.data[i - 1]; //将要删除的元素赋值给e
for(int j=i ; j<L.length ; j++) /i之后的元素向前移动一个位置
{
L.data[j - 1] = L.data[j];
}
L.length --; //表长减一
return true;
}
(4)按值查询
int LocateElem(SqList &L,Elemtype e)
{
for(int i = 0 ; i<L.langth ; i++)
{
if(L.data[i] == e)
{
return i+1; //返回位序,数组下标从0 开始,故返回i+1
}
}
return 0;
}
以上只是记录本人学习的过程,有不足之处,感谢大佬的指正