一、顺序表
1.1、顺序表的定义
顺序表——用顺序存储的方式实现线性表顺序存储。把逻辑上相邻的元素存储在物理位置也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现
1.2、顺序表的实现
1.2.1、静态分配
顺序表的静态分配,即通过数组的方式来实现一个顺序表,特点是这个数组的长度大小在创建的时候确定了以后就无法更改。下面的代码表示创建了一个类型为"SqList"的静态分配的顺序表
tips:ElemType不代表具体的数据类型,可根据自身需要修改成其他类型
#define MaxSize 10 //定义最大程度
typedef struct{
ElemType data[MaxSize]; //用静态的“数组”存放数据元素
int lenth; //顺序表的当前长度
}SqList; //顺序表的类型定义
接下来我们通过具体的代码来表示静态分配的顺序表的创建和初始化
#define MaxSize 10
#include <stdio.h>
typedef struct {
int data[MaxSize]; //用静态数组存放数据元素
int length; //顺序表的当前长度
}SqList; //顺序表的类型定义
void InitList(SqList* L) {
for (int i = 0; i < MaxSize; i++)
L->data[i] = 0; //初始化顺序表数据
L->length = 0; //初始化顺序表长度
}
int main() {
SqList L; //声明一个顺序表
InitList(&L); //初始化顺序表
return 0;
}
此时内存中地址的分配如图1
![](https://img-blog.csdnimg.cn/a2fa877265c34c04b2bd515f68c4b49c.png)
1.2.2、动态分配
顺序表的动态分配,通过malloc等函数创建容量可变的顺序表,下面的代码表示创建了一个类型为"SqList"的动态分配的顺序表
#define InitSize 10 //顺序表的初始长度
typedef struct{
ElemType *data; //指示动态分配数组的指针
int MaxSize; //顺序表的最大容量
int length; //顺序表的当前长度
}SeqList; //顺序表的类型定义
接下来我们通过具体的代码来表示动态分配的顺序表的创建和初始化
#define _CRT_SECURE_NO_WARNINGS 1
#define InitSize 10
#include <stdio.h>
typedef struct {
int* data; //指示动态分配数组的指针
int MaxSize; //顺序表的最大容量
int length; //顺序表的当前长度
}SqList; //顺序表的类型定义
void InitList(SqList* L) {
//使用malloc函数开辟一片连续的内存空间
L->data = (int*)malloc(InitSize * sizeof(int));
L->length = 0;
L->MaxSize = 0;
}
void IncreaseList(SqList* L, int len) {
int* p = L->data;
L->data = (int*)malloc((L->MaxSize + len) * sizeof(int));
for (int i = 0; i < L->MaxSize; i++)
p[i] = L->data[i]; //将数据复制到新区域
L->MaxSize = L->MaxSize + len;
free(p); //释放p指针
}
int main() {
SqList L; //声明一个顺序表
InitList(&L); //初始化顺序表
IncreaseList(&L, 5); //增加顺序表容量
return 0;
}
此时内存中地址的分配如下图2
1.3、顺序表的基本操作
1.3.1、顺序表的插入和删除
下面通过代码详解
#define MaxSize 10
#include <stdio.h>
#include <stdbool.h>
typedef struct {
int data[MaxSize]; //指示动态分配数组的指针
int length; //顺序表的当前长度
}SqList; //顺序表的类型定义
void InitList(SqList* L) {
for (int i = 0; i < MaxSize; i++)
L->data[i] = 0;
L->length = 0;
}
void ListInsert(SqList* L, int i, int e) { //在第i位序插入数据元素e
for (int j = L->length; j >= i; j--)
L->data[j] = L->data[j - 1];
L->data[i - 1] = e;
L->length++;
}
bool ListDelete(SqList* L, int i,int *x) {
if (i<1 || i>L->length) //增加i不符合条件的情况,增加代码健壮性
return false;
*x = L->data[i - 1];
for (int j = i; j < L->length; j++) {
L->data[j - 1] = L->data[j];
}
return true;
}
int main() {
SqList L; //声明一个顺序表
InitList(&L); //初始化顺序表
int x = 0; //声明变量x存放被删除的元素
if (ListDelete(&L, 4, &x))
printf("成功删除第4个元素,删除元素为%d\n", x);
else
printf("位序i不合法,删除失败\n");
return 0;
}
1.3.2、顺序表的查找
①、按位查找
#define MaxSize 10
typedef struct{
ElemType data[MaxSize];
int length;
}SqList;
ElemType GetElem(SqList L,int i){
return L->data[i-1];
}
②、按值查找
#define MaxSize 10
typedef struct{
ElemType data[MaxSize];
int length;
}SqList;
ElemType GetElem(SqList L,int i,int e){
for(int i=0;i<L->length;i++){ //从第一个元素遍历查找
if(L.data[i]==e)
return i+1; //返回查找的位序
}
return 0; //查找失败,返回0
}