美文网首页
线性表-顺序表(c++)

线性表-顺序表(c++)

作者: 三角绿毛怪 | 来源:发表于2019-07-06 20:00 被阅读0次

    顺序表

    #include <iostream>
    using namespace std;
    
    #define Node ElemType
    #define MAXSIZE  3
    #define ERROR 0
    
    typedef int DataType;
    
    //创建一个节点
    class Node
    {
    public:
        DataType data;
    };
    
    //创建一个顺序列表类
    class SqList
    {
    public:
        //构造函数初始化
        SqList();
        //在析构函数中进行销毁
        ~SqList();
        //定义创建一个顺序表
        void create_SqList(int n);
        //遍历顺序表
        void traverse_SqList();
        //根据下标查找元素
        ElemType get_elem_by_index(int i);
        //判断顺序表是否为空
        bool is_empty();
        //判断表是否满了
        bool is_full();
        //获取顺序表的长度
        int get_length();
        //是否含有查找的值
        int get_elem_by_elem(DataType data);
        //插入操作
        void insert_SqList(int n, DataType data);
        //头插
        void insert_SqList_head(DataType data);
        //尾插
        void insert_SqList_end(DataType data);
        //删除指定位置
        void delete_elem(int i);
        //按值删除
        void delete_elem_at_elem(DataType data);
        //删除所有元素
        void delete_all();
        //在头部删除元素
        void delete_head();
    private:
        //顺序表的基地址
        Node* elem;
        //顺序表的长度
        int length;
    
    };
    
    //初始化
    SqList::SqList()
    {
        //基地址指向一个新开辟的数组
        elem = new ElemType[MAXSIZE];
        int length = 0;//定义顺序表的长度
    }
    SqList::~SqList()
    {
        delete[] elem;//销毁
    }
    
    //创建顺序表
    void SqList::create_SqList(int n)
    {
        if (n < 0)
        {
            cout << "输入节点个数有误!" << endl;
        }
        else
        {
            //循环向数组插入元素
            for (int i = 0; i < n; i++)
            {
                cout << "请输入第" << i + 1 << "个节点元素:";
                cin >> elem[i].data;
            }
            length = n;//更改长度
        }
    }
    //遍历顺序表
    void SqList::traverse_SqList()
    {
        for (int i = 0; i < length; i++)
        {
            cout << "第" << i + 1 << "个元素是:" << elem[i].data << endl;
        }
    }
    //通过下标获取元素
    ElemType SqList::get_elem_by_index(int i)
    {
        if (i < 1 || i > length)
        {
            cout << "查询的下标不存在" << endl;
        }
        else
        {
            return elem[i - 1];
        }
    }
    //判空
    bool SqList::is_empty()
    {
        if (length == 0)
            return true;
        else
            return false;
    }
    //判断顺序表是否满了
    bool SqList::is_full()
    {
        if (length == MAXSIZE) return true;
        else
            return false;
    }
    //获取顺序表的长度
    int SqList::get_length()
    {
        return length;
    }
    //按值查找
    int SqList::get_elem_by_elem(DataType data)
    {
        for (int i = 0; i < length; i++)
        {
            if (elem[i].data == data) return i + 1;
            else return -1;
        }
    }
    //插入一个元素
    void SqList::insert_SqList(int i, DataType data)
    {
        //不能插入的情况
        if (i<1 || i>length + 1)
        {
            cout << "输入的下标不合法" << endl;
        }
        else if (length > MAXSIZE)
        {
            cout << "已经达到最大长度" << endl;
        }
        else
        {
            //这里的length是有几个元素,要定位到数组下标的最后一个
            //i插入为第几个元素,对应下标要-1
            for (int j = length - 1; j >= i - 1; j--)
            {
                elem[j + 1] = elem[j];//后边的往后挪挪
            }
            elem[i - 1].data = data;
            length++;
        }
    }
    //头插法
    void SqList::insert_SqList_head(DataType data)
    {
        //全体往后挪挪
        for (int i = length - 1; i >= 0; i--)
        {
            elem[i + 1] = elem[i];
        }
        elem[0].data = data;
        length++;
    }
    //尾插法
    void SqList::insert_SqList_end(DataType data)
    {
        //无法插入的情况
        if (length > MAXSIZE)
        {
            cout << "已经达到最大长度!" << endl;
        }
        else
        {
            elem[length].data = data;
            length++;
        }
    }
    //根据下标删除一个节点
    void SqList::delete_elem(int i)
    {
        if (i<1 || i>length)
        {
            cout<<"输入下标不合法!"<<endl;
        }
        else
        {
            for (int j = i; j <= length - 1; j++)//都往前挪挪
            {
                elem[j - 1] = elem[j];
            }
            length--;
        }
    }
    //按值删除元素
    void SqList::delete_elem_at_elem(DataType data)
    {
        int i = 0;
        while (elem[i].data != data && i < length)
        {
            i++;
        }
        for (int index = i; index < length; index++)
        {
            elem[index] = elem[index + 1];
        }
        length--;
    }
    //删除所有元素
    void SqList::delete_all()
    //???
    {
        for (int i = length; i > 0; i--)
        {
            elem[i] = elem[i - 1];
            length--;
        }
    }
    //在头部删除元素
    void SqList::delete_head()
    {
        for (int i = 0; i < length - 1; i++)
        {
            elem[i - 1] = elem[i];
        }
        length--;
    }
    int main()
    {
        
        return 0;
    }
    

    自己测试吧!最好是写一个尝试一个,不然太多了

    相关文章

      网友评论

          本文标题:线性表-顺序表(c++)

          本文链接:https://www.haomeiwen.com/subject/ulymhctx.html