前言
顺序表将数据存储在计算机内存中的相邻存储单元内,故结构体内部存储直接使用数组即可。
代码实现
/**
* 请注意,由于本次实现需要用到bool变量以及引用,请创建
* C++文件而不是C文件
*/
#include <iostream>
#define MAX_SIZE 50
/*int改名为ElemType的意义是,使用ElemType代表变量类型,
表示此算法对任意一个变量类型都适用*/
typedef int ElemType;
//typedef命名一个名字叫SqList的结构体
typedef struct{
ElemType data[MAX_SIZE]; //定义一个最大为50的数组
int length; //定义当前顺序表的长度(有多少个元素)
} SqList;
/**
* 将某一元素插入顺序表
* @param L 对当前顺序表的引用(C++知识)
* @param i 插入的位置
* @param e 插入的内容(当前为int类型)
* @return 插入是否成功(bool变量)
*/
bool ListInsert(SqList &L, int i, ElemType e){
//判断要插入的位置是否合法
if(i<1 || i>L.length) { //i小于1或者大于当前顺序表的长度,都是不对的,最小为1,最大为当前顺序表长度(数组比顺序表长度少1)
printf("插入位置不合法\n");
return false;
}
//判断是否超出空间了
if(L.length+1 > MAX_SIZE){
printf("超出空间\n");
return false;
}
//插入操作
/*
* 使j等于当前顺序表长度,这时的j放入数组内正好是最后一个元素的下一个
*/
for(int j = L.length; j>=i; j--){
L.data[j] = L.data[j-1];
}
//在数组上第i-1的位置插入数据
L.data[i-1] = e;
//顺序表长度+1
L.length++;
return true;
}
/**
* 将某一元素从顺序表中删除
* @param L 对当前顺序表的引用
* @param i 删除的位置
* @param &e 对e进行取值
* @return 删除是否成功(bool变量)
*/
bool ListDelete(SqList &L, int i, ElemType &e){
//判断删除的位置是否合法
if (i<1 || i>L.length){
printf("删除位置不合法\n");
return false;
}
//将要删除的值赋给e
e = L.data[i-1];
//将值删除
for(int j=i; j<L.length; j++){
L.data[j-1] = L.data[j];
}
//顺序表长度减一
L.length--;
return true;
}
/**
* 查找某一元素在顺序表中的位置
* @param L
* @param e
* @return
*/
int LocateElem(SqList L,ElemType e)
{
int i;
for(i=0;i<L.length;i++)
if(L.data[i]==e)
return i+1; //加1就是元素在顺序表中的位置
return 0;
}
/**
* 打印某一顺序表
* @param L 顺序表
*/
void ListPrint(SqList L){
//循环遍历
for(int i=0; i<L.length; i++){
printf("%d ", L.data[i]);
}
printf("\n");
}
int main() {
int length = 0;
SqList L;
printf("输入顺序表长度:");
scanf("%d", &length);
L.length = length;
for(int i=0; i<length; i++){
printf("输入第%d个位置元素:", (i+1));
scanf("%d", &L.data[i]);
}
//打印输出当前顺序表
ListPrint(L);
//定位值为30的顺序表内元素
int testLocateElem = LocateElem(L, 30);
if (testLocateElem)
printf("此元素的位置是: %d\n", testLocateElem);
else
printf("定位失败,顺序表内没有此元素\n");
//尝试删除第三位元素
int ret1;
bool testListDelete = ListDelete(L, 3, ret1);
if(testListDelete)
printf("被删除的元素是:%d\n", ret1);
printf("当前顺序表为:\n");
ListPrint(L);
//尝试将30插入第三位
bool testListInsert = ListInsert(L, 3, 30);
if (testListInsert){
printf("插入成功,当前顺序表为:\n");
ListPrint(L);
}
return 0;
}
运行结果截图![请添加图片描述](https://i-blog.csdnimg.cn/blog_migrate/2169caf57983f66870985035fc46230c.png)
运行环境
macOS BigSur
CLion
(使用其他环境的同学注意环境配置)
心得
距离最一开始学习数据结构与算法已经过去一年多了,再一次踏上对数据结构的王道征途,心情难免有些忐忑和激动。文章与代码难免出错,麻烦您在评论区指出,我一定第一时间内改正。