首页 > 编程语言 >使用C++手动封装一个顺序表,包含成员数组一个,成员变量N个

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

时间:2024-09-02 19:24:47浏览次数:16  
标签:封装 函数 int 成员 pos C++ datatype len SeqList

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

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

// 使用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;
}

运行结果:

标签:封装,函数,int,成员,pos,C++,datatype,len,SeqList
From: https://blog.csdn.net/sjrhsk_hahaha/article/details/141648889

相关文章

  • 使用C++编写程序,提示并输入一个字符串,统计其中的英文字符,数字,空格以及其他字符的数量
    由于c++兼容c语言的程序,所以子函数使用了c语言的内容#include<iostream>#include<string.h>usingnamespacestd;voidCount(constcharstr[]){intletter=0,num=0,space=0,etc=0;while(*str!='\0'){if((*str>='a'&&*......
  • c++vscode多文件实现通讯录管理系统
    c++vscode多文件实现通讯录管理系统作为c++入门级别的实战项目,此通讯管理系统项目不仅仅是对c++入门阶段学习成果的检验,也是对c++基础知识的回顾,体会c++在实战制作中的思路,是入门c++单文件实现通讯录系统的改进一、多文件通讯录管理系统简介系统需求通讯录是一个可......
  • 【Java 基础】类和对象(构造&this&封装&static&代码块)
    ✨                           风起于青萍之末,浪成于微澜之间    ......
  • IDA反编译dll库时导入C++头文件
    引言有时候,可能因为硬盘损坏等等原因,自己曾经写的动态链接库源码丢失了,幸好对应的头文件得以保留了下来,这个动态链接库主要是某种算法的实现,并没有继承其他的一些类库,比如MFC之类的,而自己对算法的实现已经忘得差不多了,而突然又需要该算法的实现过程,那么有什么办法可以帮助......
  • springboot 编程事务的封装
    一、创建事务管理工具类java复制importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;importorg.springframework.transaction.PlatformTransactionManager;importorg.springframework.transaction.Transact......
  • 【树莓派开发】树莓派GeanyIDE和控制台下C/C++中文乱码问题解决方法
    文章目录情况说明1.设置VS,将文件保存为UTF8编码2.更改GeanyIDE编码设置3.更改树莓派系统设置情况说明之前使用树莓派的时候,遇到了中文乱码的问题。VS2019编译器下写的.c文件,里面的中文注释在树莓派ide上乱码树莓派控制台上,C语言代码输出中文时乱码这里需要调整三个设置来解决该......
  • 【C++】空间配置器
    空间配置器,听起来高大上,那它到底是什么东西呢?1.什么是空间配置器?空间配置器是STL源码中实现的一个小灶,用来应对STL容器频繁申请小块内存空间的问题。他算是一个小型的内存池,以提升STL容器在空间申请方面的效率2.了解空间配置器STL以128个字节为分界线,将空间配置器分为了一级和二级2......
  • C++中namespace的用法
    我们在现实的项目开发中一般会有着大量的代码,而且代码都是多人编写的,也许一个项目会有10个功能,每一个人都要完成一个功能。但是敲过代码的都知道,一般在编写程序的时候如果多人没有实现约定去完成,那就会出现代码冲突的情况,那么,为了解决这样的冲突,我们C++中使用了命名空间namesp......
  • 41. 强化训练-字符串类封装
    强化训练-字符串类封装myString类实现自定义的字符串类属性char*pString;维护在堆区真实开辟的字符数组intm_Size;字符串长度行为有参构造MyString(char*str)拷贝构造MyString(constMyString&str);析构~MyString();重载<<运算符重载>>运算符重载......
  • 47. 继承中的同名静态成员处理
    继承中的同名静态成员处理结论和非静态成员一致只不过调用方式有两种通过对象通过类名通过类名的方式访问父类作用域下的m_A静态成员变量Son::Base::m_A#define_CRT_SECURE_NO_WARNINGS#include<iostream>usingnamespacestd;classBase{public: staticvoidfu......