数据结构

数据结构


前言

时光不负有心人,星光不问赶路人。
心血来潮,想实现一遍数据结构的算法。
努力做好这件事吧,在csdn做个记录
这是第三次实现数据结构算法,每实现一次感受都不一样,侧重点也不一样
但每次都受益匪浅
前两次都是面向过程的实现,这次挑战一下,以面向对象的方法实现,也算给自己建一个算法类库吧!!!



顺序表

/*
chp
更新时间:2020/12/4 22:19
持续更新
*/

#include <iostream>
#include <algorithm>
//#define maxSize 30
typedef int DataType;
using namespace std;

/*
顺序表的查找、删除和插入算法的时间复杂度都都是O(n)
当n很大时,执行效率非常低,造成此缺陷的原因是:为保持表中的元素的原有顺序不变,
在插入和删除时数据必须成块的移动,当数据量很大时,运算量非常可怕
所以顺序表主要用于不经常插入或删除的应用程序,但顺序表的其他操作时间复杂度都是O(1)
顺序表有直接(随机)存取的特性
*/

//顺序表类
class SeqList
{
private:
    DataType *data; //数据域
    int size;       //数据个数
    const int maxSize=30;    //最大长度
    //构造函数
public:
    SeqList()
    {
        ininList();
    }
    //顺序表初始化函数
    void ininList()
    {
        data = new DataType();
        if (!data)
        {
            cout << "无可用的空间,内存分配错误!!!";
        }
        size = 0; //长度置零
        //Maxsize = maxSize;
    }

    //清空顺序表
    void clearList()
    {
        size = 0;
    }
    //返回最大长度
    int maxsize(){
        return maxSize;
    }
    //返回顺序表现有长度
    int Length()
    {
        return size;
    }
    //按值查找,时间复杂度O(n),最好情况只需比较1次,最差为size(表的长度)
    int search(DataType x)
    {
        for (int i = 0; i < size; i++)
        {
            //成功找到
            if (data[i] == x)
            {
                return i;
            }
        }
        //查询失败
        return -1;
    }

    //输出表中元素,时间复杂度O(n)
    void show()
    {
        if (size == 0)
        {
            cout << "表空!!!" << endl;
            return;
        }
        for (int i = 0; i < size; i++)
        {
            cout << data[i] << " ";
        }
        cout << endl;
    }
    //将新元素插入到第i的位置,即data数组的i-1下标对应位置,,时间复杂度O(n)
    //最好情况移动0次,即在size+1位置插入,最差为移动size(表的长度),即在第一个位置插入
    int insert(DataType &x, int i)
    {
        //判断表是否满
        if (size == maxSize)
        {
            cout << "表已满,插入失败!!!" << endl;
            return 0;
        }
        //检查插入顺序是否合法
        if (i > maxSize || i < 1)
        {
            cout << "插入位置越界!!!" << endl;
            return 0;
        }
        //从后向前移动后(L-i+1)个元素,以便给要插入的元素腾出位置,,时间复杂度O(n)
        for (int j = size; j >= i; j--)
        {
            data[j] = data[j - 1];
        }
        data[i - 1] = x;
        //表的长度加1
        size++;
        //返回插入在data数组的下标
        return i - 1;
    }
    //删除第i个元素,即data数组的i-1下标对应位置,,时间复杂度O(n)
    //最好情况只需移动0次,即删除第size个元素,最差为size-1,即删除第一个元素
    DataType remove(int i)
    {
        //判断表是否为空
        if (!size)
        {
            cout << "表空,没有要删除的元素!!!";
            return 0;
        }
        //判读删除位置是否合法
        if (i < 1 || i > size)
        {
            cout << "删除位置非法!!!" << endl;
        }
        DataType x = data[i - 1];
        //从前往后移动元素
        for (int j = i; j < size; j++)
        {
            data[j - 1] = data[j];
        }
        //表的长度减1
        size--;
        //返回要删除元素的值
        return x;
    }
};
int main()
{
    SeqList seqList;
    for(int i=0;i<10;i++){
        DataType x = i;
        seqList.insert(x, i+1);
    }
    seqList.show();
    seqList.remove(3);
    seqList.show();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值