线性表:概念和基本操作
- 线性表的逻辑结构:
线性表是具有相同数据类型(每个数据元素所占的空间一样大)的n(n >=0)个数据元素的有限序列。
直白理解:一条线串起了一个序列,上面的数据元素类型是相同的。各个数据元素之间有前后顺序。可以通过位序表示数据元素
下图是一个长度为5的线性表
- 线性表的基本操作–创销、增删改查:
初始化:构建一个空的线性表,分配内存空间
销毁操作:销毁线性表并释放线性表所占的内存空间
插入操作:在表中的第 i 个位置上插入指定的元素a
删除操作:删除表中的第 i 个位置上元素,并用e返回删除元素的值
按值查找:在表中寻找给定关键值的元素
按位查找:获取表中第 i 个位置上元素的值
- 线性表的存储/物理结构:
关注定义,如何用代码实现,基本操作如何实现
分类:顺序表(顺序存储) 和链表(链式存储):
线性表: 顺序表
- 顺序表概念:用顺序存储的结构实现的线性表。逻辑上相邻的元素存储在物理位置上相邻的存储单元中。
- 顺序表特性
1.随机访问:可以随机访问第 i 个元素
2.存储密度高:每个节点只存储数据元素
3.扩展容量不方便:即便采用动态分配,时间开销也很大
4.插入、删除操作不方便:需要移动大量元素、 - 顺序表优点:可随机存取(通过索引位序),存储密度高
- 顺序表缺点:占用大片连续空间,改变容量不方便
顺序表的实现:静态、动态存储
- 静态分配:通常用数组实现,大小一旦被定义不可改变。存储空间不可变即为静态的,这也是静态顺序表的局限
- 动态分配:顺序表的大小是可变的。需要借助指针,指向顺序表的第一个元素。代码实现中要动态申请和释放空间,借助
malloc
和free
函数 - 代码实现顺序表
#define MaxSize 10
typedef struct{
元素变量类型 data[MaxSize];
int length;
}SqList;
void InitList(SqList){
for(int i=0;i<MaxSize;i++)
L.data[i]=0;
L.length=0;
}
int main(){
SqList L;
InitList(L);
return 0;
}
#define InitSize 10
typedef struct{
元素变量类型 *data
int MaxSize; /顺序表的最大容量
int length;
}SqList;
void InitList(){
L.data=(元素变量类型 *)malloc(InitSize*sizeof(元素变量类型));
L.length=0;
L.MaxSize=InitSize;
}
void IncreaseList(SqList &L,int len){
int *p=L.data;
L.data=(元素变量类型 *)malloc((L.MaxSize+len))*sizeof(元素变量类型));
for(int i=0;i<L.length);i++){
L.data[I]=p[i];
}
L.MaxSize=L.MaxSize+len;
free(p);
}
int main(){
SqList L;
InitList(L);
IncreaseList(L,5);
return 0;
}
顺序表的插入删除和查找(代码)
#define MaxSize 10
typedef struct{
int data[MaxSize];
int length;
}SqList;
void InitList(SqList){
for(int i=0;i<MaxSize;i++)
L.data[i]=0;
L.length=0;
}
bool InsertList(SqList &L,int i,int e){
if(i<1||i>L.length+1)
return false;
if(L.length>=MaxSize)
return false;
for(int j=L.length;j>=i;j--)
L.data[j]=L.data[j-1];
L.data[i-1]=e;
L.length++;
return true;
}
bool DeleteList(SqList &L,int i,int &e){
if(i<1||i>L.length)
return false;
e=L.data[i-1];
for(j=i;j<=L.length;j++)
L.data[j-1]=L.data[j];
L.length--;
return true;
}
int GetElem(SqList L,int i)(
return L.data[i-1];
)
int GetElem(SqList L,int i)(
return L.data[i-1];
)
int LocateElem(SqList L,int e){
for(int i=0;i<L.length;i++)
if(L.data[i]==e)
return i+1;
return 0;
}
int main(){
SqList L;
InitList(L);
InsertList(L,3,3)
int e=-1;
if (DeleteList(L,3,e))
printf("成功删除第3个元素,删除的元素为%d\n",e);
else
printf("删除失败,原因:位置不合法");
return 0;
}