线性表之顺序表 图解和代码实现

线性表的顺序存储结构称为顺序表。

 

图解:

 

 

下面来看下顺序表的C++实现:


SeqList.h文件

//SeqList.h 声明类SeqList,文件名为SeqList.h
#ifndef SeqList_H
#define SeqList_H
const int MaxSize=100;  //100只是示例性的数据,可以根据实际问题具体定义
template <class T>      //定义模板类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


 


SeqList.cpp文件

//SeqList.cpp  
#include "SeqList.h"
/*
*前置条件:顺序表不存在
*输    入:无
*功    能:构建一个顺序表
*输    出:无
*后置条件:构建一个顺序表
*/
template <class T> 
SeqList<T>:: SeqList( )
{
  length=0;
}
/*
*前置条件:顺序表不存在
*输    入:顺序表信息的数组形式a[],顺序表长度n
*功    能:将数组a[]中元素建为长度为n的顺序表
*输    出:无
*后置条件:构建一个顺序表
*/
template <class T> 
SeqList<T>:: SeqList(T a[], int n)
{
  if (n>MaxSize) throw "参数非法";
  for (int i=0; i<n; i++)  
    data[i]=a[i];
  length=n;
}
/*
*前置条件:无
*输    入:无
*功    能:无
*输    出:无
*后置条件:无
*/
template <class T> 
SeqList<T>:: ~SeqList( )
{
}
/*
*前置条件:顺序表存在
*输    入:插入元素x,插入位置i
*功    能:将元素x插入到顺序表中位置i处
*输    出:无
*后置条件:顺序表插入新元素
*/
template <class T> 
void SeqList<T>::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 <class T>
T SeqList<T>::Delete(int i)
{ 
	int x,j;
  if (length==0) throw "下溢";
  if (i<1 || i>length) throw "位置";
  x=data[i-1];
  for (j=i; j<length; j++)
    data[j-1]=data[j];   //注意此处j已经是元素所在的数组下标
  length--;
  return x;
}
/*
*前置条件:顺序表存在
*输    入:无
*功    能:输出顺序表长度
*输    出:顺序表长度
*后置条件:顺序表不变
*/
template <class T>
int SeqList<T>::Length()
{
	 return length;
}
/*
*前置条件:顺序表存在
*输    入:查询元素位置i
*功    能:按位查找位置为i的元素并输出值
*输    出:查询元素的值
*后置条件:顺序表不变
*/
template <class T> 
T SeqList<T>::Get(int i)
{
  if (i<1 && i>length) throw "查找位置非法";
    else return data[i-1];
}
/*
*前置条件:顺序表存在
*输    入:查询元素值x
*功    能:按值查找值的元素并输出位置
*输    出:查询元素的位置
*后置条件:顺序表不变
*/
template <class T>
int SeqList<T>::Locate(T x)
{     
	  for (int i=0; i<length; i++)
	   if (data[i]==x) 
	     return i+1 ;  //下标为i的元素等于x,返回其序号i+1
	  return 0;  //退出循环,说明查找失败
}
/*
*前置条件:顺序表存在
*输    入:无
*功    能:顺序表遍历
*输    出:输出所有元素
*后置条件:顺序表不变
*/
template <class T>
void SeqList<T>::PrintList()
{
	for(int i=0;i<length;i++)
	cout<<data[i]<<endl;
}


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值