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

4 篇文章 0 订阅

实现顺序表的判空,判满,添加数据,求实际长度,任意位置的插入/删除,访问数组中的任意一个元素,以及让顺序表自动扩容。

首先需要实现一个顺序表需要使用结构体构造其基本组成部分,以及基本函数接口,采用内部声明外部定义的方式。

// 使用C++手动封装一个顺序表,包含成员数组一个,成员变量N个
#include <iostream>
using namespace std;

// 类型重命名方便后续修改数据类型
using datatype = int; // = typedef int datatype;

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

public:
    // 要实现的函数
    // 初始化函数
    void init(int s)
    {
        size = s;                  // 当前数组的最大容量
        data = new datatype(size); // 在堆区申请一个顺序表容器
    }
    // 判空函数
    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 expend();
    //打印函数
    void print();
};

函数的内容如下

// 判空函数
bool SeqList::empty()
{
    return len == 0;
}
// 判满函数
bool SeqList::full()
{
    return len == size;
}
// 添加数据函数
bool SeqList::add(datatype e)
{
    if (full())
    {
        expend();
    }
    data[len++] = e;
    return 1;
}
// 求当前顺序表的实际长度
int SeqList::length()
{
    return len;
}
// 任意位置插入函数
bool SeqList::insert_pos(int pos, datatype e)
{
    if (pos < 0 || pos > len)
    {
        cout << "插入位置不合法" << endl;
        return 0;
    }
    else
    {
        if (full())
        {
            expend();
        }
        //移动后面的元素
        for (int i = len; i > pos; i--)
        {
            data[i] = data[i - 1];
        }
        //插入元素
        data[pos] = e;
        len++;
        return 1;
    }
}
// 任意位置函数函数
bool SeqList::delete_pos(int pos)
{
    if (pos < 0 || pos > len)
    {
        cout << "删除位置不合法" << endl;
        return 0;
    }
    else
    {
        //移动后面的元素
        for (int i = pos; i < len; i++)
        {
            data[i] = data[i + 1];
        }
        len--;
        return 1;
    }
}
// 访问容器中任意一个元素 at
datatype SeqList::at(int index)
{
    if (index < 0 || index > len)
    {
        cout << "访问位置不合法" << endl;
        return -1;
    }
    else
    {
        return data[index];
    }
}
//二倍扩容
void SeqList::expend()
{
    // 构造新的数组
    datatype *newData = new datatype[size * 2];

    // 复制旧数组的数据
    for (int i = 0; i < len; i++)
    {
        newData[i] = data[i];
    }
    // 释放旧数组的内存
    delete[] data;
 
    // 更新指针和大小
    data = newData;
    size *= 2;
    cout << "自动扩容" << endl;
}

// 打印列表
void SeqList::print()
{
    for (int i = 0; i < len; i++)
    {
        cout << data[i] << " ";
    }
    cout << endl;
}

测试main函数

int main()
{
    SeqList list;
    list.init (5);
    list.add (1);
    list.add (2);
    list.add (3);
    list.add (4);
    list.add (5);
    list.insert_pos(2,6);
    for (int i = 0; i < list.length(); i++)
    {
        cout << list.at(i) << " ";
    }
    cout << endl;
    list.delete_pos(4);
    list.print();

    return 0;
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值