线性表(顺序表)的存储与操作

  1. 定义顺序表的存储结构;

  2. 顺序表的基本操作
    (1)初始化顺序表(无参和有参);
    (2)求顺序表长度;
    (3)按位置查找;
    (4)按值查找;
    (5)在位置i插入一个数据元素;
    (6)删除位置i的数据元素;
    (7)遍历顺序表;
    (8)销毁顺序表。
    3.算法思想和时间复杂度
    当我们要在线性表的顺序存储结构上的第i个位置上插入一个元素时,必须先将线性表的第i个元素之后的所有元素依次后移一个位置,以便腾空一个位置,再把新元素插入到该位置。若要删除第i个元素时,也必须把第i个元素之后的所有元素前移一个位置。
    四、参考代码

  3. 顺序表的存储结构和操作接口
    //SeqList.h:定义类SeqList(接口描述),文件名为SeqList.h
    #ifndef SeqList_H //条件编译开始,_H前面的字符串是类头文件名
    #define SeqList_H
    const int MaxSize=100; //100只是示例性的数据,可以根据实际问题具体定义
    template //定义模板类SeqList
    class SeqList
    {
    public:
    SeqList( ); //无参构造函数
    SeqList(T a[], int n); //有参构造函数
    ~SeqList(); //析构函数为空
    int Length(); //求线性表的长度
    T Get(int i); //按位查找,取线性表的第i个元素
    int Locate(T x); //按值查找,求线性表中值为x的元素序号
    void Insert(int i, T x); //在线性表中第i个位置插入值为x的元素
    T Delete(int i); //删除线性表的第i个元素
    void PrintList(); //遍历线性表,按序号依次输出各元素
    private:
    T data[MaxSize]; //存放数据元素的数组
    int length; //线性表的长度
    };

#endif //条件编译结束

2.顺序表操作的实现
//SeqList.cpp
#include “SeqList.h”
/*
*前置条件:顺序表不存在
*输 入:无
*功 能:构建一个顺序表
*输 出:无
*后置条件:构建一个顺序表
/
template
SeqList:: SeqList( )
{
length=0;
}
/

*前置条件:顺序表不存在
*输 入:顺序表信息的数组形式a[],顺序表长度n
*功 能:将数组a[]中元素建为长度为n的顺序表
*输 出:无
*后置条件:构建一个顺序表
/
template
SeqList:: SeqList(T a[], int n)
{
if (n>MaxSize) throw “参数非法”;
for (int i=0; i<n; i++)
data[i]=a[i];
length=n;
}
/

*前置条件:无
*输 入:无
*功 能:无
*输 出:无
*后置条件:无
/
template
SeqList:: ~SeqList( )
{
}
/

*前置条件:顺序表存在
*输 入:插入元素x,插入位置i
*功 能:将元素x插入到顺序表中位置i处
*输 出:无
*后置条件:顺序表插入新元素
*/
template
void SeqList::Insert(int i, T x)
{
int j;
if (length==MaxSize) throw “上溢”;
if (i<1 || i>length+1) throw “位置”;
for (j=length; j>=i; j–)
data[j]=data[j-1]; //注意第j个元素存在数组下标为j-1处
data[i-1]=x;
length++;
}

/*
*前置条件:顺序表存在
*输 入:要删除元素位置i
*功 能:删除顺序表中位置为i的元素
*输 出:无
*后置条件:顺序表删除元素
/
template
T SeqList::Delete(int i)
{
T x;
int j;
if (length==0) throw “下溢”;
if (i<1 || i>length) throw “位置”;
x=data[i-1];
for (j=i; j<=length-1; j++)
data[j-1]=data[j]; //注意此处j已经是元素所在的数组下标
length–;
return x;
}
/

*前置条件:顺序表存在
*输 入:无
*功 能:输出顺序表长度
*输 出:顺序表长度
*后置条件:顺序表不变
/
template
int SeqList::Length()
{
return length;
}
/

*前置条件:顺序表存在
*输 入:查询元素位置i
*功 能:查找位置为i的元素并输出值
*输 出:查询元素的值
*后置条件:顺序表不变
/
template
T SeqList::Get(int i)
{
if (i<1|| i>length) throw “查找位置非法”;
else return data[i-1];
}
/

*前置条件:顺序表存在
*输 入:查询元素值x
*功 能:按值查找值的元素并输出位置
*输 出:查询元素的位置
*后置条件:顺序表不变
/
template
int SeqList::Locate(T x)
{
for (int i=0; i<=length-1; i++)
if (data[i]==x)
return i+1 ; //下标为i的元素等于x,返回其序号i+1
return 0; //退出循环,说明查找失败
}
/

*前置条件:顺序表存在
*输 入:无
*功 能:顺序表遍历
*输 出:输出所有元素
*后置条件:顺序表不变
*/
template
void SeqList::PrintList()
{
for(int i=0;i<length;i++)
cout<<data[i]<<endl;
}

3.顺序表的调试运行
//SeQListMain.cpp
#include <iostream.h> //引用输入输出流库函数的头文件
#include “SeqList.cpp” //引用顺序表类SeqList

void main( )
{

SeqList a; //创建一个空的顺序表
cout<<“执行插入操作:”<<endl;
try
{
a.Insert(1,1);
a.Insert(2,3);
a.Insert(3,4);
}
catch(char* wrong)
{
cout << wrong; //如失败提示失败信息
}
cout<<“已经插入“1,3,4””<<endl;
cout<<endl;
cout<<“顺序表a的长度为:”;
cout<<a.Length()<<endl; //返回单链表长度
cout<<endl;
cout<<“按位查询第二个元素:”<<endl;
cout<<“第二个元素为:”;
cout <<a.Get(2)<<endl; //查找顺序表中第二个元素
cout<<endl;
cout<<“按值查询3:”<<endl;
cout<<“值为3的元素位置为:”;
cout<<a.Locate(3)<<endl; //查找元素3,并返回在单链表中位置
cout<<endl;
try
{
if(a.Length()){
cout<<“执行删除第一个元素操作:”<<endl;
cout<<endl;
a.Delete(1); //删除元素1
cout<<“已删除成功,顺序表a的长度为:”;
cout<<a.Length()<<endl;
}

else{
cout<<“顺序表a长度为0”<<endl;
}
}
catch(char* wrong)
{
cout << wrong; //如失败提示失败信息
}
cout<<endl;
cout<<“顺序表a中的元素有:”<<endl;
a.PrintList(); //输出所有元素

int r[]={1,2,3,4,5};
SeqList b(r,5); //根据数组创建顺序表
cout<<“执行插入操作前顺序表b为:”<<endl;
b.PrintList(); //输出顺序表所有元素
cout<<“插入前顺序表b的长度为:”;
cout<<b.Length()<<endl;
try
{
b.Insert(3,8);
}
catch(char* wrong)
{
cout << wrong; //如失败提示失败信息
}
cout<<“执行插入操作后顺序表b为:”<<endl;
b.PrintList(); //输出顺序表b所有元素
cout<<“插入后顺序表b的长度为:”;
cout<<b.Length()<<endl;
cout<<endl;
try
{
if(a.Length()){
cout<<“执行删除第一个元素操作:”<<endl;
cout<<endl;
b.Delete(1); //删除b中第一个元素
cout<<“已删除成功,顺序表b的长度为:”;
cout<<b.Length()<<endl;
}

else{
cout<<“顺序表b长度为0”<<endl;
}
}
catch(char* wrong)
{
cout << wrong; //如失败提示失败信息
}
cout<<“执行插入操作后顺序表b为:”<<endl;
b.PrintList(); //输出顺序表所有元素
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值