【C++】使用C++手动封装一个顺序表,包含成员数组一个,成员变量N个

 1、使用C++手动封装一个顺序表,包含成员数组一个,成员变量N个

        错误记录:在add添加数据函数中,使用full函数判满操作后,调用完expend二倍扩容函数后,没有去处return 0,导致虽然成功扩容,但是数据少了一位。

#include <iostream>

using namespace std;

using datatype = int;           //类型重定义
#define MAX 5

struct SeqList
{
    private:
        datatype *data;         //顺序表的数组
        int size = 0;           //数组的大小
        int len = 0;            //顺序表的实际长度

    public:
        //初始化函数
        void init(int s);

        //判空函数
        bool empty();

        //判满函数
        bool full();

        //添加数据函数
        bool add(datatype e);

        //求当前顺序表的实际长度
        int length();

        //遍历表中数据
        void show();

        //任意位置插入函数
        bool insert_pos(int pos,datatype e);

        //任意位置删除函数
        bool delete_pos(int pos);

        //访问容器中的任意一个元素
        datatype &at(int index);

        //二倍扩容
        void expend();
};

void SeqList::init(int s)
{
    size = s;                       //当前数组的最大容量
    data = new datatype[size];      //在堆区申请一个顺序表容器
}

bool SeqList::empty()
{
    return len == 0;                //如果len等于0,返回真(1),表示表为空
}

bool SeqList::full()
{
    return len == size;             //如果len等于size,返回真(1),表示表已满
}

void SeqList::show()
{
    cout<<"表中的数据为:";
    for(int i = 0; i < len; i++)
    {
        cout<<data[i]<<",";
    }
    cout<<endl;
}

int SeqList::length()
{
    return len;
}

bool SeqList::insert_pos(int pos,datatype e)
{
    if(pos < 0 || pos > len || full())
    {
        cout<<"位置输入有误,或者表已满"<<endl;
        return 0;
    }

    //循环将元素后移
    for(int i = len-1; i >= pos-1; i--)
    {
        data[i+1] = data[i];
    }
    data[pos-1] = e;     //赋值到指定位置上
    len++;              //顺序表长度加1
    cout<<"按位置插入数据成功"<<endl;

    return 1;
}

bool SeqList::delete_pos(int pos)
{
    if(pos < 0 || pos > len || empty())
    {
        cout<<"位置输入有误,或者表为空"<<endl;
        return false;
    }

    //根据位置将后续元素向前覆盖
    for(int i = pos-1; i < len-1; i++)
    {
        data[i] = data[i+1];
    }
    len--;                  //表长减1

    cout<<"按位置删除数据成功"<<endl;
    return true;
}

datatype &SeqList::at(int index)
{
    if(index < 0 || index >= len)
    {
        cout<<"位置输入有误"<<endl;
    }
    return data[index-1];             //返回想要找的元素
}

void SeqList::expend()
{
    if(len == size)
    {
        //定义一个新的容器,大小为原来的2倍
        datatype *temp = new datatype[size * 2];
        //复制旧元素到新的内存空间中
        for(int i = 0; i < len; i++)
        {
            temp[i] = data[i];
        }
        delete []data;  //释放旧内存空间
        data = temp;    //将新容器赋值给旧的容器
        size *= 2;      //大小为原来的两倍
        cout<<"二倍扩容成功"<<endl;
    }
}


bool SeqList::add(datatype e)
{
    //如果满了就执行二倍扩容
    if(full())
    {
        expend();
    }
    data[len++] = e;            //将e的值赋值给data[len],len从0开始,赋值完后len自增1
    cout<<"插入数据成功"<<endl;
    return 1;
}


int main()
{
    SeqList list;           //定义一个顺序表

    list.init(MAX);          //对顺序表进行初始化,并分配内存
    list.add(20);            //插入20
    list.add(520);            //插入520
    list.add(1314);            //插入1314
    list.add(30);            //插入30
    list.add(40);            //插入40

    list.show();             //输出数据

    /*************************************************************/
    //1、求数组当前长度
    int lenS = list.length();
    cout<<"数组长度为:"<<lenS<<endl;

    list.add(666);            //插入666,这里是为了验证二倍扩容是否成功

    //2、再次求数组当前长度
    lenS = list.length();
    cout<<"数组长度为:"<<lenS<<endl;

    list.show();             //输出数据

    /*************************************************************/
    list.insert_pos(2,666);      //在2号位置插入666

    list.show();             //输出数据

    list.delete_pos(2);         //删除2号位置数据

    list.show();             //输出数据

    datatype &num = list.at(3);

    cout<<"num = "<<num<<endl;


    return 0;
}

输出结果如下:

2、思维导图

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值