C++day2

一、思维导图

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

cpp 复制代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <csignal>

using namespace std;
using datatype = int;
#define MAX 30

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


public:
    //初始化函数
    void init(int n);
    //判空函数
    bool empty();
    //判满函数
    bool full();
    //添加数据函数
    bool add(datatype element);
    //求当前顺序表的实际长度
    int seq_length();
    //任意位置插入函数
    bool insert_pos(int pos, datatype element);
    //任意位置函数函数
    bool delete_pos(int pos);
    //访问容器中任意一个元素 at
    datatype &at(int index);
    //遍历展示顺序表
    bool list_show();

    //二倍扩容
    void expend();
    //销毁
    void destroy();

};
//结构体函数定义
void Seqlist::init(int n)
{
    size = n;                       //当前数组的最大容量
    data = new datatype[size];      //在堆区申请一个顺序表容器
}

bool Seqlist::empty()
{
    return len==0?1:0;
}

bool Seqlist::full()
{
    return len==size?1:0;
}

bool Seqlist::add(datatype element)
{
    //判满
    bool res = full();
    if(res == 1)
    {
        expend();
    }
    data[len] = element;
    len++;
    cout<<"size ="<<size<<endl;
    return 1;
}

int Seqlist::seq_length()
{
    return len;
}

bool Seqlist::insert_pos(int pos, datatype element)
{
    //判满
    bool res = full();
    if(res == 1)
    {
        expend();
    }
    //判断pos合法性
    if(pos<0 || pos>len)
    {
        cout<<"插入位置错误"<<endl;
        return 0;
    }
    //插入位置所有元素后移
    for(int i=len-1;i>len-pos;i--)
    {
        data[i+1] = data[i];
    }
    // 插入新元素
    data[pos] = element;
    // 更新长度
    len++;
    return 1;
}

datatype& Seqlist::at(int index)
{
    //判断位置合法
    if(index<0 || index>=len)
    {
        cout<<"访问位置错误,返回默认位置"<<endl;
        return data[0];
    }
    return data[index];
}

bool Seqlist::list_show()
{
    //判断表空
    if(len == 0)
    {
        cout<<"empty"<<endl;
        return 0;
    }
    for(int i=0;i<len;i++)
    {
        cout<<data[i]<<"\t";
    }
    cout<<endl;
    return 1;
}
void Seqlist::expend()
{
    //申请二倍空间
    datatype* temp =new datatype[size*2];
    //将原顺序表拷贝到新顺序表
    memcpy(temp,data,size* sizeof(datatype));
    delete[] data;                  //销毁原顺序表
    data = temp;                    //data重新指向新顺序表
    size *= 2;
}

void Seqlist::destroy()
{
    delete[] data;
    size = 0;
    len = 0;
    data = NULL;
}

int main()
{
    cout<<"***********顺序表***********"<<endl;
    cout<<"         1、创建顺序表         "<<endl;
    cout<<"         2、初始化顺序表       "<<endl;
    cout<<"         3、任意位置插入       "<<endl;
    cout<<"         4、打印顺序表         "<<endl;
    cout<<"         5、打印任意位置       "<<endl;
    cout<<"         6、销毁顺序表         "<<endl;

    //实例化一个顺序表
    Seqlist list;
    while(1)
    {
        //system("cls");         //清屏
        int menu = 0;
        cout<<"请输入操作选项:";
        cin>>menu;
        switch(menu)
        {
        case 1:
        {
            cout<<"创建顺序表"<<endl;
            int size = 0;
            cout<<"请输入需要创建顺序表的大小"<<endl;
            cin>>size;

            list.init(size);
            cout<<"创建成功"<<endl;
        }
            break;
        case 2:
        {
            cout<<"初始化顺序表"<<endl;
            int n = 0;
            cout<<"请输入您要插入数据个数"<<endl;
            cin>>n;

            datatype element = 0;
            for(int i=0;i<n;i++)
            {
                cout<<"请输入第"<<i+1<<"个数据"<<endl;
                cin>>element;
                list.add(element);
            }
            cout<<"初始化成功"<<endl;
        }
            break;
        case 3:
        {
            cout<<"任意位置插入"<<endl;
            int pos = 0;
            datatype element;
            cout<<"请输入您要插入的位置"<<endl;
            cin>>pos;
            cout<<"请输入您要插入的元素"<<endl;
            cin>>element;
            bool res = list.insert_pos(pos,element);
            if(res == 1)
            {
                 cout<<"任意位置插入成功"<<endl;
            }
        }
            break;
        case 4:
        {
            cout<<"打印顺序表"<<endl;
            //输出
            list.list_show();
        }
            break;
        case 5:
        {
            cout<<"打印任意位置"<<endl;
            int pos = 0;
            cout<<"请输入您要查看的位置:";
            cin>>pos;
            cout<<list.at(pos-1)<<endl;
        }
            break;
        case 6:
        {
            cout<<"销毁顺序表"<<endl;
            list.destroy();
            cout<<"销毁成功"<<endl;
        }
            break;
        default:
            cout<<"选项输入错误"<<endl;
        }
    }

    return 0;
}
相关推荐
ling1s1 分钟前
C#基础(9)ref和out
开发语言·c#
EterNity_TiMe_14 分钟前
【C语言进阶】C语言动态内存管理:深入理解malloc、calloc与realloc
c语言·开发语言·学习·visualstudio·性能优化·学习方法
Dingdangr15 分钟前
了解 Python中的`try...except...finally`语句块是如何工作的?
开发语言·python
wxy202431516 分钟前
连年(年份)
c语言·c++·算法
LuckyRich126 分钟前
【高阶数据结构】跳表
开发语言·数据结构·c++
Java__攻城狮33 分钟前
java设计模式(持续更新中)
java·开发语言·设计模式
铁打的阿秀1 小时前
okhttp 报java.lang.IllegalStateException: closed
java·开发语言·okhttp
Zhen (Evan) Wang1 小时前
What is new in C# 7,8,9,10
开发语言·c#
桃酥4031 小时前
贪心算法day31|56. 合并区间、738. 单调递增的数字(整数与字符串的转换)、贪心刷题总结
c++·算法·leetcode·贪心算法·字符串
有杨既安然1 小时前
Python数据分析与可视化基础教程
开发语言·python·信息可视化·数据分析·excel