数组静态分配实现线性表基本操作C/C++(插入,删除,按值按位查找)
程序员文章站
2024-03-22 19:00:34
...
线性表基本操作
/**
* 数组静态分配实现线性表基本操作
*/
#include <cstdio>
#define maxsize 10
/**
* 定义结构
*/
typedef struct {
int data[maxsize];
int length;
}SqList;
/**
* 初始化
* 思路:
* 将所有空间初始化为0,若不初始化,可能有脏数据存在
* 1、将所有空间数据初始化为0
* 2、长度初始化为0
*/
int initList(SqList &L){
for(int & i : L.data){//i表示L.data的各个元素
i=0; //将个元素置为0
printf("初始化的值- %d \n",i);
}
L.length=0;
printf("初始化length- %d \n",L.length);
return 0;
}
/**
* 在第i位置data[i-1]插入元素
* 思路:
* 1、校验i的合法性,L是否已满
* 2、将i位置以及之后的位置元素后移
* 3、给i位置赋值新元素
* @return
*/
bool insertList(SqList &L,int i, int value){
//i是位置从1开始,length是长度,从1开始;
if(i>L.length+1 || i<1){
printf("输入i值不合法,超出范围\n");
return false;
}
if(L.length >= maxsize){
printf("空间已满,不可再插入\n");
return false;
}
//从最后一个元素开始后移,最后一个元素下表l.length-1
//j表示下标j=L.length 表示最后一个元素后一个元素的下标
for(int j=L.length;j>=i;j--){
L.data[j]=L.data[j-1];
}
L.data[i-1]=value;
L.length ++ ;
return true;
}
/**
* 删除第i位置(data[i-1])的数据
* 思路:
* 1、校验i的合法性,L是否为0
* 2、删除i位置,下标[i-1]的数据元素
* 3、i之后所有元素前移一位
* @return
*/
bool delList(SqList &L, int i){
if(L.length == 0){
printf("L长度为0,没有可删除元素\n");
return false;
}
if(i<1 || i>L.length+1){
printf("i值不合法,超出范围\n");
return false;
}
printf("删除的i位置的元素 = %d\n", L.data[i-1]);
//j表示下标,i表示位置,i位置的下标为j-1
//data[j]表示i位置之后一个位置的下标
for(int j=i ; j<L.length ;j++){
L.data[j-1]=L.data[j];
}
L.length--;
printf("删除数据之后的长度 = %d\n",L.length);
return true;
}
/**
* 获取i位置的值
* 思路:
* 1、校验i的合法性
* 2、返回data[i-1]
* @return
*/
int getElemValue(SqList &L,int i){
if(i>L.length){
printf("i值不合法,超出范围 \n");
return -1;
}else{
return L.data[i-1];
}
}
/**
* 获取值为10的元素位序
* 思路:
* 1、找到第一个值为10的元素,返回其下标
* @return
*/
int getElemLocation(SqList &L,int elemValue){
for (int i=0;i<L.length;i++){
if(L.data[i] == elemValue){
return i+1;
}
}
return -1;
}
int main() {
SqList L;
//初始化
initList(L);
printf("---------------初始化操作结束------------ \n");
//循环插入操作 i表示位置序号
for (int i = 1; i <= 9; i++) {
insertList(L,i,i);
printf("插入的数据 下标[%d]- 值:%d\n",i-1 , L.data[i-1]);
printf("length- %d\n",L.length);
}
insertList(L,3,10);
printf("插入之后的length- %d + 插入的值- %d\n",L.length,L.data[2]);
printf("---------------插入数据操作结束------------- \n");
//删除位序i的值
delList(L,9);
printf("删除的i位序的现有值- %d 删除之后length- %d\n",L.data[9-1] ,L.length);
printf("---------------删除数据操作结束------------- \n");
//获取i位置的值
int value = getElemValue(L,3);
printf("i位置的值- %d \n",value);
//获取值为10的下标
int location = getElemLocation(L,10);
printf("值为10的下标- %d \n",location);
printf("-----------按位、按值获取数据结束------------ \n");
printf("Hello, World!\n");
return 0;
}
测试结果展示
初始化的值- 0
初始化的值- 0
初始化的值- 0
初始化的值- 0
初始化的值- 0
初始化的值- 0
初始化的值- 0
初始化的值- 0
初始化的值- 0
初始化的值- 0
初始化length- 0
---------------初始化操作结束------------
插入的数据 下标[0]- 值:1
length- 1
插入的数据 下标[1]- 值:2
length- 2
插入的数据 下标[2]- 值:3
length- 3
插入的数据 下标[3]- 值:4
length- 4
插入的数据 下标[4]- 值:5
length- 5
插入的数据 下标[5]- 值:6
length- 6
插入的数据 下标[6]- 值:7
length- 7
插入的数据 下标[7]- 值:8
length- 8
插入的数据 下标[8]- 值:9
length- 9
插入之后的length- 10 + 插入的值- 10
---------------插入数据操作结束-------------
删除的i位置的元素 = 8
删除数据之后的长度 = 9
删除的i位序的现有值- 9 删除之后length- 9
---------------删除数据操作结束-------------
i位置的值- 10
值为10的下标- 3
-----------按位、按值获取数据结束------------
Hello, World!
Process finished with exit code 0