首页 > 编程语言 >C++类实现顺序表

C++类实现顺序表

时间:2024-03-19 09:31:19浏览次数:16  
标签:顺序 return 实现 ElemType C++ int length SqList data

环境:vscode

sequencelist.h

#ifndef SEQUENCELIST_H
#define SEQUENCELIST_H

#define MAXSIZE 20 // 最大存储容量
typedef int ElemType;

class SqList
{
public:
    SqList();                        //
    SqList(ElemType elems[], int n); // 有参构造器
    ~SqList();                       //
    bool CreatList();                // 新建一个顺序表
    bool UnionList(SqList L1, SqList L2);
    int LocateElem(ElemType e);          // 按元素查找:成功则返回元素的序号(从1开始),失败则返回0
    int ListLength();                    // 顺序表的长度
    bool GetElem(int i, ElemType &e);    // 查找第i个位置的元素
    bool ListInsert(int i, ElemType e);  // 在第i个位置插入元素
    bool ListDelete(int i, ElemType &e); // 删除第i个位置的元素
    bool ListEmpty();                    // 判空
    void clearList();                    // 清空顺序表
    void display();                      // 显示当前的顺序表

private:
    ElemType data[MAXSIZE]; // 下标从0开始,但是对线性表的操作中的下标从1开始:第1个元素其实就是下标为0的元素
    int length;
};

#endif // SEQUENCELIST_H

sequencelist.cpp

#include "sequencelist.h"
#include <iostream>
using namespace std;

SqList::SqList()
{
    length = 0;
}

SqList::SqList(ElemType elems[], int n)
{
    if (n > MAXSIZE)
    {
        cout << "顺序表过长,只接收了前" << MAXSIZE << "个元素" << endl;
        length = MAXSIZE;
    }
    else
    {
        length = n;
    }
    for (int index = 0; index < length; index++)
    {
        data[index] = elems[index];
    }
}

SqList::~SqList()
{
    
}

bool SqList::CreatList()
{
    cout << "插入多少个元素(0-20)?" << endl;
    cin >> length;
    if (length < 0 || length > MAXSIZE)
    {
        length = 0;
        return false;
    }
    for (int i = 1; i <= length; i++)
    {
        data[i - 1] = i;
    }
    return true;
}

bool SqList::UnionList(SqList L1, SqList L2)
{
    int i, j;
    for (i = 0; i < L1.length; i++)
    {
        data[i] = L1.data[i];
    }
    for (j = 0; j < L2.length; j++)
    {
        if (L1.LocateElem(L2.data[j]) == 0)
        {
            if (i > MAXSIZE)
            {
                return false;
            }
            else
            {
                data[i] = L2.data[j];
                i++;
            }
        }
    }
    length = i;
    return true;
}
int SqList::LocateElem(ElemType e)
{
    for (int index=0; index < length; index++)
    {
        if (data[index] == e)
        {
            return index;
        }
    }
    return 0;
}
int SqList::ListLength()
{
    return length;
}
bool SqList::GetElem(int i, ElemType &e)
{
    if (length == 0 || i < 1 || i > length)
        return false;
    e = data[i - 1];
    return true;
}
bool SqList::ListInsert(int i, ElemType e)
{
    if (length == MAXSIZE || i < 1 || i > length + 1) // 线性表满,或者i的范围不在合理范围内时返回错误
        return false;
    if (i <= length)
    {
        for (int index = length - 1; index >= i - 1; index--)
        {
            // 插入位置的后续元素后移一位
            data[index + 1] = data[index]; // 倒序挪动位置,避免覆盖问题
        }
    }
    data[i - 1] = e;
    length++;
    return true;
}
bool SqList::ListDelete(int i, ElemType &e)
{
    if (length == 0 || i < 1 || i > length) // 线性表空,或者i的范围不在合理范围内时返回错误
        return false;
    e = data[i - 1];
    for (int k = i - 1; k < length - 1; k++)
    {
        // 插入位置的后续元素前移一位
        data[k] = data[k + 1]; // 正序挪动位置,避免覆盖问题
    }
    length--;
    return true;
}
bool SqList::ListEmpty()
{
    if (length == 0)
        return true;
    return false;
}
void SqList::clearList()
{
    length = 0;
}
void SqList::display()
{
    if (length == 0)
    {
        cout << "[]" << endl;
        return;
    }
    cout << "[";
    for (int i = 0; i < length - 1; i++)
    {
        cout << data[i] << ", ";
    }
    cout << data[length - 1] << "]" << endl;
}



int main()
{
    SqList list;
    int num;
    ElemType elem;
    bool flag;

    cout << "            1.顺序表的创建和显示" << endl;
    if (!list.CreatList())
        cout << "顺序表创建失败!" << endl;
    else
        cout << "顺序表创建成功!    " << endl;
    // 顺序表的显示
    list.display();
    cout << endl
        << endl;

    cout << "            2.按元素查找" << endl;
    num = list.LocateElem(3);
    cout << "3是顺序表的第" << num+1 << "个元素" << endl
        << endl
        << endl;

    cout << "            3.按位置查找" << endl;
    list.GetElem(4, elem);
    cout << "顺序表的第4个元素是:" << elem << endl
        << endl
        << endl;

    cout << "            4.顺序表的插入" << endl;
    if (list.ListInsert(2, 10))
        cout << "插入成功!第2个位置插入10后:    " << endl;
    else
        cout << "插入失败!" << endl;
    list.display();
    cout << endl
        << endl;

    cout << "            5.删除元素" << endl;
    list.ListDelete(5, elem);
    cout << "删掉第5个元素:" << elem << endl;
    cout << "该表的长度为:" << list.ListLength() << endl;
    list.display();
    cout << endl
        << endl;

    cout << "            6.清空顺序表" << endl;
    cout << "清空顺序表前-----";
    if (!list.ListEmpty())
    {
        cout << "当前顺序表不是空表!" << endl;
        list.clearList();
        cout << "清空顺序表后-----";
        if (list.ListEmpty())
            cout << "当前顺序表是空表!" << endl;
    }
    cout << endl
        << endl;

    cout << "            7.合并顺序表" << endl;
    ElemType elems1[8] = {0, 1, 2, 3, 4, 5, 6, 7};
    ElemType elems2[9] = {5, 6, 7, 8, 9, 10, 11, 1, 12};

    SqList list1 = {elems1, 8};
    SqList list2 = {elems2, 9};
    SqList list3;
    cout << "合并前的两个表为:" << endl;
    list1.display();
    list2.display();
    flag = list3.UnionList(list1, list2);
    if (!flag)
        cout << "合并后,顺序表的长度超过最大范围" << endl;
    cout << "该表的长度为:    " << list3.ListLength() << endl;
    list3.display();
    return 0;
}

标签:顺序,return,实现,ElemType,C++,int,length,SqList,data
From: https://blog.csdn.net/yangguanghhh/article/details/136829473

相关文章

  • 爬虫实战:从网页到本地,如何轻松实现小说离线阅读
    今天我们将继续进行爬虫实战,除了常规的网页数据抓取外,我们还将引入一个全新的下载功能。具体而言,我们的主要任务是爬取小说内容,并实现将其下载到本地的操作,以便后续能够进行离线阅读。为了确保即使在功能逐渐增多的情况下也不至于使初学者感到困惑,我特意为你绘制了一张功能架构图......
  • 面试官:volatile如何保证可见性的,具体如何实现?
    写在开头在之前的几篇博文中,我们都提到了volatile关键字,这个单词中文释义为:不稳定的,易挥发的,在Java中代表变量修饰符,用来修饰会被不同线程访问和修改的变量,对于方法,代码块,方法参数,局部变量以及实例常量,类常量多不能进行修饰。自JDK1.5之后,官网对volatile进行了语义增强,这让它......
  • me5413算法的实现细节
    Introduction这项作业的目的是让你通过几种基本规划算法及其应用来积累经验。在实施和测试这些算法后,你应该能够了解到规划中的现实挑战以及每种算法的优缺点。Task1:GlobalPlanningForbothTask1&2ofyourplanninghomework,youwillbeusingamapoftheVivoCity......
  • EasyExcel实现文件上传下载(百万级数据、单元格自定义样式)
    文章目录一、EasyExcel介绍二、写Excel1、最简单的写2、列宽、行高、背景颜色、字体大小颜色、对齐方式2.1、编码方式2.2、注解方式3、复杂头与修改列顺序4、日期、数字类型和自定义格式化5、设置单元格下拉6、重复多次写入(百万数据)7、导出指定列8、动态生成表头9、模......
  • Redis第三弹,定时删除1.优先级队列(堆)2.基于时间轮实现的定时器​编辑Type指令(返回key对
    目录定时删除1.优先级队列(堆)2.基于时间轮实现的定时器​编辑Type指令(返回key对应的数据类型)redis的数据类型hsetkeyfieldvalue(这里是使用hash作为数据结构)小结定时删除redis并未实现定时器的方式,实现定时器的方式,实现过期key删除,若多个key过期,也可通过一个......
  • 当我需要实现某个外部属性变化,更新表格的某一列,所有值均为变化后的值,应该如何实现
    在这里,将tableData添加到useEffect的依赖数组会导致无限循环。因为在useEffect内部更新了tableData状态,每次状态改变又会触发useEffect再次执行,形成无限循环。解决这个问题的一种方法是,在状态更新时创建一个新的数组,而不是直接修改现有数组。这样就不会触发依赖数组中tableData的......
  • 设计模式学习(一)单例模式的几种实现方式
    目录前言饿汉式懒汉式懒汉式DCLP局部静态式(Meyers'Singleton)单例模板参考文章前言单例模式,其核心目标是确保在程序运行的过程中,有且只有存在一个实例才能保证他们的逻辑正确性以及良好的效率。因此单例模式的实现思路就是确保一个类有且只有一个实例,并提供一个该实例的全局访问......
  • 字符串压缩(C++)
    字符串压缩:    例如:aaaabbbccx-->4a3b2cx,单个字符不压缩。基本思想:前后两两字符作比较,若相同则计数器加一,若不同则直接输出。程序代码:#include<iostream>intmain(){ strings; intcount=1; cin>>s; s=s+"";//加上空格是为了方便最后一个字符的比较 in......
  • 【算法与数据结构】二叉树链式结构的实现【前中后序】
    文章目录......
  • 【c++】string类---标准库(STL)中的string类
    主页:醋溜马桶圈-CSDN博客专栏:c++_醋溜马桶圈的博客-CSDN博客gitee:mnxcc(mnxcc)-Gitee.com目录1.STL(标准库)1.1什么是STL1.2STL的版本1.3 STL的六大组件1.4 STL的重要性1.5 如何学习STL6.STL的缺陷2.为什么要学习string类2.1C语言中的字符串2.2OJ中......