顺序表的定义以及基础操作
-
顺序表的定义:顺序表分为静态和动态两种类型。静态顺序表的长度是固定的,而动态顺序表的长度可以变化,以适应不同的存储需求。
-
顺序表的初始化:介绍了如何初始化静态和动态顺序表。静态顺序表的初始化较为简单,而动态顺序表需要动态分配内存。
-
顺序表的长度增加:对于动态顺序表,提供了一个方法来增加其长度,以适应更多的数据存储需求。
-
顺序表的插入操作:详细描述了如何在静态顺序表中插入新元素,包括对插入位置的合法性检查和元素的移动。
-
顺序表的删除操作:解释了如何从顺序表中删除指定位置的元素,并处理了元素的移动和内存释放。
-
顺序表的查找操作:介绍了两种查找方式:按位置查找和按值查找,展示了如何在顺序表中快速定位元素。
(1)顺序表的定义
①静态(长度不可变)
#define MAXSIZE 100 // 定义最大长度
typedef struct
{
int data[MAXSIZE];
int length;
} SqList;
②动态(长度可变)
#define InitSize 100
typedef struct
{
int *data;
int MaxSize;
int length;
} SepList;
(2)顺序表的初始化
①静态
// 初始化一个顺序表(静态)
void InitSqList(SqList &L) {
//不必要的默认值
// for(int i=0;i<=L.length;i++){
// L.data[i]=0;
// }
L.length = 0;
}
②动态
// 初始化一个顺序表(动态)
void InitSepList(SepList &L) {
L.data = (int *)malloc(InitSize * sizeof(int));
if (L.data == NULL) {
cout << "内存分配失败" << endl;
exit(1);
}
L.length = 0;
L.MaxSize = InitSize;
}
动态可以增加表长:
// 写一个方法增加顺序表的长度
void IncreaseSize(SepList &L, int len) {
int *p = L.data; // 创建一个p指针指向顺序表
L.data = (int *)malloc((L.MaxSize + len) * sizeof(int));
if (L.data == NULL) {
cout << "内存分配失败" << endl;
free(p);
exit(1);
}
// 复制原来的数据到新的区域
for (int i = 0; i < L.MaxSize; i++) {
L.data[i] = p[i];
}
free(p);
L.MaxSize += len;
}
(3)顺序表的插入
// 顺序表的插入(用的静态)
bool SqList_Insert(SqList &L, int i, int e) {
// 把e插入到第i个位置上
// 为了算法的健壮性,添加异常处理,判断i是否合法
if (i < 1 || i > L.length + 1) {
cout << "插入位置不合法,超出表的索引" << endl;
return false;
}
if (L.length >= MAXSIZE) {
cout << "表已经满啦~" << endl;
return false;
}
for (int j = L.length; j >= i; j--) {
// i之后的元素后移
L.data[j] = L.data[j - 1];
}
L.data[i - 1] = e; // 把新的元素e插到的第i个位置
L.length++;
return true;
}
(4)顺序表的删除
// 顺序表的删除(用的静态)
bool SqList_Delete(SqList &L, int i, int &e) {
if (i < 1 || i > L.length) {
cout << "删除位置不合法,超出表的索引" << endl;
return false;
}
e = L.data[i - 1]; // 获取被删除元素的值
for (int j = i; j < L.length; j++) {
// i之后的元素前移
L.data[j - 1] = L.data[j];
}
cout << "删除了元素:" << e << endl;
L.length--;
return true;
}
(5)顺序表的查找
①按照位置查找
//按位查找
bool SqList_GetByKey(SqList &L,int i, int &value){
if (i < 1 || i > L.length) {
cout << "查找位置不合法,超出表的索引" << endl;
return false;
}
else{
value=L.data[i-1];
cout << "位置:"<<i<<" 查找成功! 值为:"<< value << endl;
return true;
}
}
②按照值查找
//按值查找
bool SqList_GetByvalue(SqList &L,int value,int &key){
for(int i = 0; i<=L.length; i++){
if(L.data[i]==value){
key=i+1;
cout<<"查找值:"<<value<<" 成功,地址为:"<<key<<endl;
return true;
}
}
cout<<"查找值:"<<value<<" 失败。查无此值"<<endl;
return false;
}
(6)全部完整代码(可以直接运行)
#include <iostream>
using namespace std;
#define MAXSIZE 100 // 定义最大长度
typedef struct
{
int data[MAXSIZE];
int length;
} SqList;
// 初始化一个顺序表(静态)
void InitSqList(SqList &L) {
//不必要的默认值
// for(int i=0;i<=L.length;i++){
// L.data[i]=0;
// }
L.length = 0;
}
#define InitSize 100
typedef struct
{
int *data;
int MaxSize;
int length;
} SepList;
// 初始化一个顺序表(动态)
void InitSepList(SepList &L) {
L.data = (int *)malloc(InitSize * sizeof(int));
if (L.data == NULL) {
cout << "内存分配失败" << endl;
exit(1);
}
L.length = 0;
L.MaxSize = InitSize;
}
// 写一个方法增加顺序表的长度
void IncreaseSize(SepList &L, int len) {
int *p = L.data; // 创建一个p指针指向顺序表
L.data = (int *)malloc((L.MaxSize + len) * sizeof(int));
if (L.data == NULL) {
cout << "内存分配失败" << endl;
free(p);
exit(1);
}
// 复制原来的数据到新的区域
for (int i = 0; i < L.MaxSize; i++) {
L.data[i] = p[i];
}
free(p);
L.MaxSize += len;
}
// 顺序表的插入(用的静态)
bool SqList_Insert(SqList &L, int i, int e) {
// 把e插入到第i个位置上
// 为了算法的健壮性,添加异常处理,判断i是否合法
if (i < 1 || i > L.length + 1) {
cout << "插入位置不合法,超出表的索引" << endl;
return false;
}
if (L.length >= MAXSIZE) {
cout << "表已经满啦~" << endl;
return false;
}
for (int j = L.length; j >= i; j--) {
// i之后的元素后移
L.data[j] = L.data[j - 1];
}
L.data[i - 1] = e; // 把新的元素e插到的第i个位置
L.length++;
return true;
}
// 顺序表的删除(用的静态)
bool SqList_Delete(SqList &L, int i, int &e) {
if (i < 1 || i > L.length) {
cout << "删除位置不合法,超出表的索引" << endl;
return false;
}
e = L.data[i - 1]; // 获取被删除元素的值
for (int j = i; j < L.length; j++) {
// i之后的元素前移
L.data[j - 1] = L.data[j];
}
cout << "删除了元素:" << e << endl;
L.length--;
return true;
}
//顺序表的查找:
//按位查找
bool SqList_GetByKey(SqList &L,int i, int &value){
if (i < 1 || i > L.length) {
cout << "查找位置不合法,超出表的索引" << endl;
return false;
}
else{
value=L.data[i-1];
cout << "位置:"<<i<<" 查找成功! 值为:"<< value << endl;
return true;
}
}
//按值查找
bool SqList_GetByvalue(SqList &L,int value,int &key){
for(int i = 0; i<=L.length; i++){
if(L.data[i]==value){
key=i+1;
cout<<"查找值:"<<value<<" 成功,地址为:"<<key<<endl;
return true;
}
}
cout<<"查找值:"<<value<<" 失败。查无此值"<<endl;
return false;
}
int main() {
SqList La;
InitSqList(La);
cout << "初始化后La的长度:" << La.length << endl;
if (SqList_Insert(La, 1, 3)) { // 在第1个位置插入元素3
cout << "太好了,插入成功了!" << endl;
} else {
cout << "可恶啊,插入失败了!" << endl;
}
cout << "插入一个元素后La的长度:" << La.length << endl;
int e;
if (SqList_Delete(La, 1, e)) { // 删除第1个位置的元素
cout << "删除成功!" << endl;
} else {
cout << "删除失败!" << endl;
}
cout << "删除后La的长度:" << La.length << endl;
SqList_Insert(La, 1, 3);//插入一个数据
SqList_GetByKey(La,1,e);
SqList_GetByvalue(La,4,e);
return 0;
}