c++实现顺序表类(顺序存储)

本文深入讲解了顺序表的实现原理及各种操作,包括创建、遍历、查询、插入、删除等,探讨了其时间复杂度,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类的声明

一般类的声明在头文件中进行,类中成员函数的实现在源文件中进行

#define node elemType
//将node变量化,以后node如果要替换为双链表节点等,只需要修改此处即可
using namespace std;
typedef int dataType; //与上同样的道理,如果数据类型有变化,只需要修改此处即可
class node{
  public:
      dataType data;
};
class sql{
   public:
       sql();
       ~sql();
       void creatSql(int n); //输入n个数值构造n个节点
       void traverseSql();//遍历节点并输出
       bool isEmpty();//判断线性表是否为空
       bool isFull();//判断线性表是否为满
       int getLength();//返回线性表当前长度
       bool getElemByIndex(int i,dataType& elem);//按索引返回线性表中元素
       bool getElemByElem(dataType data,int& elem);//按数值返回线性表中元素
       bool insertSql(int n,dataType data);//按索引位置插入元素
       bool insertSqlAtHead(dataType data);//在顺序表头插入元素
       bool insertSqlAtEnd(dataType data);//在顺序表尾插入元素
       bool delElemByIndex(int i);//按索引删除元素
       bool delElemByElem(dataType data);//按元素值删除元素
       bool delAllElem();//删除所有
   private:
    int length;//顺序表当前长度
    node *elem;//顺序表首地址,类似于数组中数组名
};

类的实现

#include <iostream>
#include "sqlDef.h"
#include <cstdlib>
#define maxSize 10 //顺序表中元素最大元素个数
using namespace std;
sql::sql(){
   elem=new elemType[maxSize];//申请连续的地址空间,并将首地址赋给elem
   length=0;
}
sql::~sql(){
    delete []elem;
}
void  sql::creatSql(int n){
    if(n<1||n>maxSize){
        cout<<"输入的数目不符合规范"<<endl;
        exit(0);
    }
    for(int i=0;i<n;i++){
        cout<<"输入第"<<i+1<<"个数据"<<endl;
        cin>>elem[i].data;
    }
    length=n;
};
void sql::traverseSql(){
    for(int i=0;i<length;i++){
        cout<<elem[i].data<<' '<<endl;
    }
};
bool sql::isEmpty(){
    if(length==0)
        return true;
    else
        return false;
};
bool  sql::isFull(){
    if(length==maxSize)
        return true;
    else
        return false;
};
int   sql::getLength(){
    return length;
};
bool sql::getElemByIndex(int i,dataType& temp){//利用引用将值传出
    if(i<0||i>length-1){
        cout<<"范围越界"<<endl;
        return false;
    }
    temp=elem[i].data;
    return true;
};
bool sql::getElemByElem(dataType data,int&temp){
    int i;
    for(i=0;i<length;i++){
        if(elem[i].data==data){
        temp=i;
        return true;

        }
    }
        return false;
};
bool sql::insertSql(int n,dataType data){
    if(n<0||n>length){
        cout<<"插入范围越界"<<endl;
        return false;
    }
    else if(length==maxSize){
        cout<<"线性表已满"<<endl;
        return false;
    }
    for(int i=length-1;i>=n;i--){
        elem[i+1]=elem[i];
    }//元素依次后移,再将数据插入,要注意i=length-1,再i递减到n,将n位置以后的数全部后移一个位置
    elem[n].data=data;
    length++;
    return true;
};
bool sql::insertSqlAtHead(dataType data){
    if(length==maxSize){
        cout<<"线性表已满"<<endl;
        return false;
    }
    for(int i=length-1;i>=0;i--){
        elem[i+1]=elem[i];
    }
    elem[0].data=data;
    length++;
    return true;
};
bool sql::insertSqlAtEnd(dataType data){
    if(length==maxSize){
        cout<<"线性表已满"<<endl;
        return false;
    }
    elem[length].data=data;
    length++;
    return true;
};
bool sql::delElemByIndex(int i){
    if(i<0||i>=length){
        cout<<"范围越界"<<endl;
        return false;
    }
    for(int k=i;k<length;k++){
        elem[k]=elem[k+1];
    }
    length--;
    return true;
};
bool sql::delElemByElem(dataType data){
    int i=0;
    while(elem[i].data!=data&&i<length)
        i++;
    if(i==length){
        cout<<"线性表中无此元素"<<endl;
        return false;
    }
    for(int k=i;k<length;k++){
        elem[k]=elem[k+1];
    }
    length--;
    return true;
};
bool sql::delAllElem(){
    if(length==0){
        cout<<"线性表为空"<<endl;
        return false;
    }
    length=0;
    return true;
};
int main()
{
    sql sql0;
    int temp,data=2;
    sql0.creatSql(3);
    sql0.traverseSql();
//  sql0.getElemByElem(data,temp);
//  cout<<temp<<endl;
//  sql0.insertSql(2,10);
//  sql0.insertSqlAtHead(9);
//  sql0.insertSqlAtEnd(5);
//  sql0.delElemByIndex(1);
//  sql0.delElemByElem(5);
//  sql0.delAllElem();
//  cout<<sql0.getLength();
    sql0.traverseSql();
    system("pause");
    return 0;
}

顺序表在插入和删除时需要移动大量元素,时间复杂度为O(n),每次在插入和删除操作时,不要忘记了关键操作length++或者length--

使用c++实现顺序表:多文件编程,层次清晰,函数有注释 SeqList();//构造函数,存储的元素个数设为0 bool setLength(size_t length);//设置已经存储的元素个数 bool addElement(ElemType element);//把某个元素添加到顺序表末尾 bool addElement(ElemType element , size_t n);//插入一个元素,使其成为第n个元素,其余元素后移 bool delElement();//删除所有的元素 bool delElement(size_t n);//删除第n个元素 bool delElement(string elementDetailType,string elementDetail);//通过某个元素细节找到元素,把这个元素删除 bool replaceElement(ElemType element , size_t n);//使用一个元素,替换掉第n个元素 bool swapElement(size_t n1 , size_t n2);//把第n1个元素第n2个元素交换 ElemType* getElement();//得到数组头的指针 ElemType* getElement(size_t n);//得到第n个元素的指针 size_t getLength();//得到存储的元素个数 size_t getMaxSize();//得到顺序表容量 bool showElementDetail();//输出所有的元素细节 bool showElementDetail(size_t n);//输出第n个元素的细节 bool showElementDetail(string elementDetailType,string elementDetail);//通过某个元素细节找到元素,输出元素所有细节 size_t findElement(string elementDetailType,string elementDetail);//通过某个元素细节找到元素位置 static int inputAInt(int min = 0,int max = 9,int defaultValue = -1);//从键盘读取,限制为一个min到max间的整数,非法情况返回defaultValue void startControlLoop();//打开控制界面 ~SeqList();//析构函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值