#include <stdio.h>
//顺序表的初始化及插入操作实战
#define MaxSize 50
typedef int ElemType;//为什么这样设计,一旦用这种方式下面写代码,方便后续顺序表存储的不是整形方便修改,统一修改
typedef struct{
ElemType data[MaxSize];
int len;//顺序表长度
}Sqlist;
//顺序表的插入,因为顺序表L会改变,因此我们呢这里用引用
bool ListInsert(Sqlist &L,int pos,ElemType elem)//elem 没有加取地址&符,因为elem这里只从外面读
{
//判断pos是否合法
if(pos < 1 || pos > L.len+1){
return false;//插入失败
}
//如果存储空间满了就不能插入
if(L.len==MaxSize){
return false;//插入失败
}
//把后面的元素依次往后移动,放出位置
for(int j=L.len;j>=pos;j--){
L.data[j]=L.data[j-1];
}
L.data[pos-1]=elem;//在该位置上放入值
L.len++;//表长度当然会加一了
return true;//插入成功
}
//删除顺序表中的元素,顺序表L同样会改变,pos要删除元素的位置,e获取被删除元素的值
bool ListDelete(Sqlist &L,int pos,ElemType &e){//这里为什么e加&符号,因为e会改变,和插入不同
//判断删除的位置是否合法,那为什么操作的下标不是从0开始,要从1开始?
if(pos <1 || pos >L.len){
return false;//这里return返回的话,直接提前结束了
}
e=L.data[pos-1];//因为是通过下标来删除某个值,这里把删掉的值给e保存,然后再传给del这个实参
//这里取下标,删除某个值,就好比我所要删除的东西,并不是直接的,而是通过线性表间接删除,怎么理解,
// 我要取出这个东西,拿走是ctrl+c 而不是通过 ctrl+x 弄过来的,意思原路径还存在,是通过强制手段,
// 比如删除第四个,把第五个赋值给第四个,依次6->5,7->6,发现6,7一样的值,通过len--删除最后一空间,达到任务
int j;
for(j=pos-1;j<L.len-1;j++){//往前移动元素,len为啥-1,因为到七的位置下标是第六,为什么小于第六,因为第七的位置上没有值,也就是说后面没有值再付给它,直接把第六删了
L.data[j]=L.data[j+1];
}
L.len--;//顺序表长度减一,中间少了一个,都往前移,倒数第一个和倒数第二的元素值是一样的,因为是通过后一个赋值到前一个,所以把最后面那个元素删掉
}
//打印顺序表,这里不加&L因为不需要修改
void PrintList(Sqlist L){
int i;
for(i=0;i<L.len;i++){
printf("%3d",L.data[i]);//为了打印到一行
}
}
//查找某个元素的位置,找到了返回该元素的位置,否则返回0
int LocateElem(Sqlist L,ElemType searchelem){
int i;
for(i=0;i<L.len;i++){
if(searchelem==L.data[i]){
return i+1;//i是数组的下标,加一以后是顺序表的下标,说过了return会让函数直接结束
}
}
return 0; //循环结束了,还没找到
}
int main() {
Sqlist L;//定义了一个顺序表
bool retInsert;//用来装函数的返回值,布尔类型是true,或者false
bool retDelete;
L.data[0]=1;//往顺序表放的元素,静态输入
L.data[1]=2;
L.data[2]=3;
L.len=3;//设置长度
retInsert=ListInsert(L,2,60);
if(retInsert){
printf("insert sqlist success\n");
PrintList(L);
} else{
printf("插入失败\n");
}
printf("\n-------------------------------------\n");
//删除的元素存在del中
ElemType del;
retDelete=ListDelete(L,1,del);//删掉第一个元素
if(retDelete){
printf("delete sqlist success\n");
printf("delete element is%3d\n",del);
PrintList(L);
}
printf("\n-------------------------------------\n");
int searchLoc;//存储元素位置
searchLoc=LocateElem(L,60);
if(searchLoc){
printf("found success\n");
printf("element position is%3d\n",searchLoc);
}else{
printf("don't found this one\n");
}
return 0;
}
标签:return,线性表,删除,int,pos,len,基本操作,data,物理
From: https://blog.csdn.net/Binyu_Z/article/details/137408341