线性表顺序存储实现

本文详细介绍了如何在C语言中使用自定义的顺序表数据结构,包括初始化、插入、删除操作的实现以及元素定位功能。通过实例展示了如何在顺序表中插入元素、删除指定位置的元素,并能搜索元素的位置。
#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;
}

de80f3cd7e5d4253bd15b8dff4b77538.png

 

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值