顺序表的定义、初始化、销毁、插入、删除、查找

静态分配的顺序表操作: 

define maxsize 100;

//定义——静态分配
typedef struct {
  int data[maxsize];
  int length;
}SqList;

SqList L;
//初始化——静态顺序表
initList(SqList &L)
{
    for(int i=0;i<maxsize;i++)//赋初值可以省略,但是会有脏数据
       L.data[i]=0;
    L.legth=0;
}
//静态分配存在数组存满和内存浪费的问题

//判断顺序表是否为空——静态分配
bool Empty(SqList L){
    if(L.length==0)
        return true;
    else
        return false;
}
  
//插入——静态数组
bool ListInsert(SqList &L,int i,int e){//在第i个位置插入元素,下标为i-1
    //顺序表满了 插入失败
    if(i>=L.length+1||i<1)//注意排除隔空插入!
        return false;
    if(L.length>maxsize)
        return false;
    //找到第i-1个元素,将它后面的元素全部往后挪一位
    for(int j=L.length;j>=i;j--)
        L.data[j]=L.data[j-1];
    //插入元素
    L.data[i-1]=e;
    //更新数据
    L.length++;
    return true;
}
  
//删除——静态数组
void ListDelete(SqList &L,int i,int &e){
    //如果顺序表不空
    if(i>0&&i<=L.length){
        //找到第i个元素并返回
        e=L.data[i-1];
        //找到第i个元素,之后的元素全部往前挪
        for(int j=i;j<L.length;j++)
        {
            L.data[j-1]=L.data[j];
        }
        //更新数据
        L.length--;
    }
    else
        return flase;
}
  
//按值查找——静态分配
int LocateElem(SqList L,int e){
    for(int j=0;j<L.length;j++){
        if(L.data[j]==e){
            return j+1;//位序和下标不一样
            break;//返回找到的第一个e的位置
        }
    }
    return 0;
}
  
//按位查找——静态分配
int GetElem(SqList L,int i){
    //判断i的合法性
    if(i>=1&&i<=L.length){
        return L.data[i-1];
    }
}
  
//求表长
int Length(SqList L){
    return L.length;
}
  
//判空
bool Empty(SqList L){
    if(L.length==0)
        return true;
    else
        return false;
}

动态分配的顺序表操作:

//定义——动态分配
typedef struct{
  int * data;
  int length;
  int maxsize;
}SeqList;

SeqList L;
//初始化——动态顺序表
InitList(SeqList &L){
    L.data=(int *)malloc(sizeof(int)*Initsize);
    L.length=0;
    L.maxsize=Initsize;//申请多大的空间就有多大空间的内存分配
}

//动态顺序表增加长度
void IncreaseSize(SeqList &L,int len){
    //开辟一段新空间,将旧值复制,释放原来的空间
    //用p标记原来的那段空间的首地址
    int * p =L.data;
    //开辟一段新的长度增加了的内存
    L.data=(int *)malloc(sizeof(int)*(L.maxsize+len)
    for(int 0;i<L.length;i++)
        L.data[i]=p[i];
    //更新动态数组最大长度
    L.maxsize=L.length+len;//L.maxsize+len也行
    //释放原来的内存空间
    free(p);
} 

//按位查找——动态分配,和静态分配的按位查找一样
int GetElem(SeqList L,int i){
    //判断数据合法性
    if(i>0&&i<=L.length){
        return L.data[i-1];
        //注意这里动态分配的数据访问和普通数组访问一样!
        //虽然data是指针,但也可以用数组的方式访问。
    }
}

//按值查找——动态分配,和静态分配的按值查找一样
int LocateElem(SeqList L,int e){
    //从前往后遍历匹配
    for(int j=0;j<L.length;j++){
        if(L.data[j]==e){
            return j+1;//位序和下标不一样
            break;//写上break,只返回找到的第一个e的位置
        }
    }
    return 0;
}

//销毁顺序表
void DestoryList(SeqList * L){
    L->length = 0;
    L->maxsize = 0;
    free(L->data);
    L->data = NULL;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pumkinnnan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值