线性表的顺序存储结构

逻辑描述

用一段地址连续的存储单元依次存储数据元素
在这里插入图片描述

实现

1、C++中用数组存储顺序表
2、顺序表是一种随机存取结构 LOC(ai)=LOC(a1)+(i-1)×c
3、线性表中的元素类型不固定,所以需要使用模板机制


const int MAXSIZE = 1000;
template <class T> class SeqList {
public:
  SeqList();  
  SeqList(const T a[], int n);
  int  GetLength();           //顺序表长度
  T  Get(int i);              //获取第i个位置元素
  int  Locate(T x);           //查找值为x的元素
  void  Insert(int  i, T x);  //插入x元素,在第i个位置
  T  Delete(int i);           //删除第i个元素
  void     PrintList ();      //打印各元素
 private:
  T  data[MAXSIZE];     //存储顺序表的数组
  int  length;          //顺序表的长度
};

初始化–构造函数

无参构造函数:用于建立空顺序表


template <class T>
SeqList<T>::SeqList ()  {length=0;}

有参构造函数:创建一个长度为n的顺序表 ——使用含有n个元素的数组a初始化

伪代码
[1] 若n太大,则抛出异常
[2] 将数组a中的各个元素赋值到data数组中
[3] 修改顺序表长度

//有参构造函数,使用含有n个元素的数组a初始化
template <class T>
SeqList<T>::SeqList(const T a[], int n) 
{
    if (n>MAXSIZE) throw "数组长度超过顺序表的最大长度";
    for (int i=0;i<n;i++)
       data[i]=a[i];
    length=n;
}

遍历

template <class T>
void SeqList<T>::PrintList() 
 {
      cout << "按序号依次遍历线性表中的各个数据元素:" << endl;
      for (int i=0;i<length;i++)
         cout << data[i] << " ";
      cout << endl;
}

插入

伪代码
[1] 若表满,则抛出上溢异常
[2] 若插入位置错误,则抛出位置异常
[3] 从最后一个元素到第i个元素,顺序后移
[4] 将x存放到第i个元素位置
[5] 修改顺序表长度加1

void  SeqList<T>::Insert(int  i, T x)
{
if (Length>Maxsize) throw "上溢异常"if (i<1||i>Length+1) throw "位置异常"for(int j=Length;j<i;j--)
	data[j]=data[j-1];
data[i-1]=x;
Length++;	
}

删除

伪代码
[1] 如果表空,则抛出下溢异常;
[2] 如果删除元素位置不合理,则抛出位置异常;
[3] 取出将被删除的元素;
[4] 依次从第i+1个元素开始到第n个元素分别前移一个位置;
[5] 表长减1,并返回被删元素的值。

T  SeqList<T>::Delete(int i)
{
if (Length==0) throw"下溢异常";
if (i>length||i<1) throw "位置异常";
T x=data[i-1];
for(int j=i;j<Length;j++)
	data[j-1]=data[j];
Length--;	

}

查找

按值查找


//查找线性表中值为x的元素,找到后返回其位置
//设data[0]默认不存储顺序表数据元素
template <class T>
int SeqList<T>::Locate(const T x) 
{
 data[0]=x;
 int i=length;
 while (x!=data[i]) i--;
 return i;
}

按位查找


//获取线性表第i个位置上的元素
template <class T>
T SeqList<T>::Get(int i)
{
 if (i<1||i>length) throw "查找位置非法";        
 return data[i-1]; 
}

顺序表应用举例


#include "SeqList.h"
void main()
{
 int a[7]={1,2,3,4,5,6,7};
 SeqList <int> list(a,7);
 list.PrintList ();
 list.Insert (1,0);
 list.PrintList ();
 int x = list.Delete (8);
 cout << "删除元素:"<< x << endl;
 list.PrintList ();
 int p = list.Locate (4);
 cout << "元素4的位置:" << p << endl;
}

小结

SeqList的实质是一个容器,用来存储同类型的多个数据,并且封装了一些算法,以简化上层的应用。
优点
1 结构简单
2 可直接定位表中元素,随机查找速度快
缺点
1 存储空间静态分配,难以选择合适的存储容量。
2 插入删除需要移动大量元素,平均需要移动一半元素,效率较低。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值