坐牢第三十一天(c++)

一.作业:

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

复制代码
#include <iostream>
#include <cstring> // 引入cstring以使用memcpy
using namespace std;
// 类型重命名
using datatype = int; // typedef int datatype;
struct SeqList
{
private:
    // datatype data[MAX] = {0};                //顺序表的数组
    datatype *data; // 顺序表的数组
    int size = 0;   // 数组的大小
    int len = 0;    // 顺序表实际长度
public:
    // 初始化函数
    void init(int s);
    // 要实现的函数
    // 判空函数
    bool empty();
    // 判满函数
    bool full();
    // 添加数据函数
    bool add(datatype e);
    // 求当前顺序表的实际长度
    int length();
    // 任意位置插入函数
    bool insert_pos(int pos, datatype e);
    // 任意位置删除函数
    bool delete_pos(int pos);
    // 访问容器中任意一个元素 at
    datatype &at(int index);
    // 遍历整个数组输出
    void show();
    // 君子函数:二倍扩容
    void expend();
    // 释放函数
    void free();

};
// 初始化函数
void SeqList::init(int s)
{
    size = s;                  // 当前数组的最大容量
    data = new datatype[size]; // 在堆区申请一个顺序表容器
}
// 判空函数
bool SeqList::empty()
{
    if (len == 0)
    {
        return true;
    }
    else
    {
        return false;
    }
}
// 判满函数
bool SeqList::full()
{
    if (size == len)
    {
        return true;
    }
    else
    {
        return false;
    }
}
// 添加数据函数
bool SeqList::add(datatype e)
{
    if (data == NULL)
    {
        cout << "添加数据失败" << endl;
        return false;
    }
    if (full())
    {
        expend();
    }
    data[len]=e;
    len++;
    cout << "添加数据成功" << endl;
    return true;
}
// 求当前顺序表的实际长度
int SeqList::length()
{
    return len;
}
// 任意位置插入函数
bool SeqList::insert_pos(int pos, datatype e)
{
    if (data == NULL || pos < 0 || pos > len)
    {
        cout << "插入数据失败" << endl;
        return false;
    }
    if (full())
    {
        expend();
    }
    for (int i = len - 1; i >= pos; i--)
    {
        data[i + 1] = data[i];
    }
    data[pos] = e;
    len++;
    cout << "插入数据成功" << endl;
    return true;
}
// 任意位置删除函数
bool SeqList::delete_pos(int pos)
{
    if (data == NULL || SeqList::empty() || pos < 0 || pos >= len)
    {
        cout << "删除数据失败" << endl;
        return false;
    }
    for (int i = pos + 1; i < len; i++)
    {
        data[i - 1] = data[i];
    }
    len--;
    cout << "删除数据成功" << endl;
    return true;
}
// 访问容器中任意一个元素 at
datatype &SeqList::at(int index)
{
    if (data == NULL || SeqList::empty() || index < 0 || index >= len)
    {
        cout << "访问数据失败" << endl;
    }
    return data[index];
}
// 遍历整个数组输出
void SeqList::show()
{
    if (data==NULL||empty())
    {
        cout << "遍历数组失败" << endl;
        return ;
    }
    cout << "数组中的数据:" << endl;
    for (int i = 0; i < length(); i++)
    {
        cout << data[i] <<'\t';
    }
    cout << endl;
}
// 释放函数
void SeqList::free()
{
    delete []data;
    data=NULL;
    cout << "释放空间成功"<<endl;
}
// 君子函数:二倍扩容
void SeqList::expend()
{
    datatype *temp;
    size = 2*size;
    temp =new datatype[size];
    std::memcpy(temp,data,size/2*sizeof(datatype));
    free();
    data =temp;
    cout << "申请空间已满" << endl;
    cout << "自动二倍扩容" << endl;
    cout << length() << endl;
}
int main()
{
    SeqList L;
    L.init(1);
    L.add(1);
    L.add(2);
    L.add(3);
    L.add(4);
    L.add(5);
    L.add(6);
    L.add(6);
    L.add(6);
    L.add(99);
    L.add(99);
    L.add(99);
    L.add(99);
    L.add(99);
    L.show();
    L.free();
    L.show();
    return 0;
}

效果图:

二.思维导图:

相关推荐
盐焗鹌鹑蛋25 分钟前
【Linux】线程概念和控制
java·linux·服务器
芯祥联32 分钟前
STM32 上跑 MQTT 怎么选?嵌入式 MQTT 客户端 C 语言实现对比
c语言·stm32·单片机·嵌入式硬件·网络协议·开源·broker
chenbingjie_c8 小时前
C++ 进阶核心知识点总结:模板、内存分区、new/delete、内存池
开发语言·c++
Escalating_xu9 小时前
【C 语言】深入理解指针(1·下):指针运算、野指针、assert 与传址实战
java·c语言·开发语言
Frank_refuel9 小时前
【C++】Json库介绍和使用
c++
重生之小比特9 小时前
【C++进阶】map和set
java·开发语言·c++
阿钱真强道10 小时前
20 嵌入式操作系统 | ubus:把自己的程序状态暴露出去
c语言·进程通信·ubus·ubusd·blobmsg
知识分享小能手11 小时前
C++ 学习教程,从入门到精通,C++对象和类 — 详细知识点总结(10)
开发语言·c++·学习
顺顺 尼11 小时前
linux 进程信号(上)
linux·c++·算法
niuTaylor11 小时前
飞腾 FT-2000/4 Ubuntu 内存卡 / NVMe SSD 系统制作完整指南
linux·服务器·人工智能·驱动开发·单片机