第二章:线性表
一、线性表
1.线性表的定义
线性表—具有相同数据类型的n(n≥0)个数据元素的有限序列,其中n为表长,n为0时线性表是一个空表。
2.基本操作
2.1 InitList(&L)
初始化表。构造一个空的线性表L,分配内存空间。
2.2 DestroyList(&L)
销毁操作。销毁线性表,并释放线性表L所占用的内存空间。
2.3 ListInsert(&L,i,e)
插入操作。在表L中的第i个位置上插入指定元素e。
2.4 ListDelete(&L,i,&e)
删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值。
2.5 LocateElem(L,e)
按值查找操作。在表L中查找具有给定关键字值的元素。
2.6 GetElem(L,i)
按位查找操作。获取表L中第i个位置的元素的值。
2.7 其他常用操作
Length(L):求表长。返回线性表L的长度,即L中数据元素的个数。
PrintList(L):输出操作。按前后顺序输出线性表L的所有元素值。
Empty(L):判空操作。若L为空表,则返回true,否则返回false。
从无到有 从有到无
Tips:
①对数据的操作(记忆思路)——创销、增删改查
②C语言函数的定义—— <返回值类型> 函数名(<参数1类型>参数1,<参数2类型>参数2,……)
③实际开发中,可根据实际需求定义其他的基本操作
④函数名和参数的形式、命名都可改变(Reference:严蔚敏版《数据结构》)
⑤什么时候要传入引用“&”——对参数的修改结果需要“带回来”
二、顺序表
1.顺序表的定义
用顺序存储的方式实现线性表。
顺序存储—把逻辑上相邻的元素存储在物理 位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。
2.顺序表的实现
静态分配 动态分配
//静态分配
typedef struct{
int data[10]; //用静态的数组存放数据元素
int length;
}SqList;
void InitList(SqList &L){
//初始化一个顺序表
for(int i=0;i<10;i++){
L.data[i]=0;
}
L.length=0;
}
//动态分配
typedef struct{
int *data;
int MaxSize;
int length;
}SeqList;
void IncreaseSize(SeqList &L,int len){
//增加动态数组的长度
int *p = L.data;
//动态申请内存空间
//malloc函数返回一个指针,需要强制转型为你定义的数据元素类型指针
//malloc函数头文件<stdlib.h>
L.data = (int *)malloc((L.Maxsize+len)*sizeof(int));
for(int i=0;i<L.length;i++){
L.data[i] = p[i];
}
L.MaxSize = L.MaxSize+len;
free(p);
}
3.顺序表的特点
① 随机访问 ,即可以在O(1)时间内找到第i个元素。
②存储密度高,每个节点只存储数据元素
③拓展容量不方便(即便采用动态分配的方式实现,拓展长度的时间复杂度也比较高)
④插入、删除操作不方便,需要移动大量元素
4.顺序表的基本操作
4.1 插入
ListInsert(&L,i,e)—在表L中的第i个位置上插入指定元素e。
void ListInsert(SqList &L,int i,int e){
for(int j=L.length;j>=i;j--){
L.data[j] = L.data[j-1];
}
L.data[i-1] = e;
L.length++;
}
//时间复杂度:O(n)
4.2 删除
ListDelete(&L,i,&e)—删除表L中第i个位置的元素,并用e返回删除元素的值。
void ListDelete(SqList &L,int i,int &e){
e = L.data[i-1];
for(int j=i;j<L.length;j++){
L.dara[j-1] = L.data[j];
}
L.length--;
}
//时间复杂度:O(n)
4.3 按值查找
LocateElem(L,e)—在表L中查找具有给定关键字值的元素。
//在顺序表L中查找第一个元素值等于e的元素,并返回其位序
int LocateElem(SqList L,int e){
for(int i=0;i<L.length;i++){
if(L.data[i]==e){
return i+