1.线性表的顺序结构定义:线性表的顺序表示指是用一组地址连续的存储单元依次存储线性表的数据元素。
2.特点:逻辑上相邻的元素,在物理上也是相邻的。
3.关系表示:假设线性表的每一个元素占用N个存储单元,并以所占的第一个单元的存储地址作为存储的起始位置。则线性表中第i个数据的储存位置
a
(
i
)
=
a
(
1
)
+
N
∗
(
i
−
1
)
a(i) = a(1)+N*(i-1)
a(i)=a(1)+N∗(i−1)
4.实现: 如下为用c++实现线性表的顺序表表示:
(1) 顺序表的初始化,为顺序表动态分配一个MAX_SIZE大小存储空间,并且让m_data指向这个储存空间的基地址。
bool create_list()
{
//构造一个空的顺序表
m_data = new T[MAX_SIZE];
if(!m_data)
{
return false;
}
return true;
}
(2)取值操作,指定位置序号,获取顺序表中第i个元素的值
bool get_element(int i,T& e)
{
if(i<1 || i> m_length)
{
return false;
}
e = m_data[i-1];
return true;
}
(3) 获取顺序表中当前元素的个数
int get_length()
{
return m_length;
}
(4) 查找操作,查找到顺序表中第1个与指定元素e相等的元素,若查找返回该元素的位置序号,若查找失败则返回0
int find_element(const T& e)
{
//在顺序表中查找值为e的元素,返回其序号
for(int i=0;i<m_length;i++)
{
if(m_data[i]==e)
{
return (i+1);
}
}
return 0;
}
(5) 在顺序表的中追加元素
bool push_back(const T& e)
{
return insert_element(m_length+1,e);
}
(6) 在顺序表中的第i个位置插入元素e,使的长度为n线性表(a(1),…,
a(i-1),a(i+1),…,a(n))变成长度为n+1的线性表(a(1),…,
a(i-1),e,a(i),…a(n))
bool insert_element(int i,const T& e)
{
if(i<1 || i>(m_length+1))
{
return false;
}
if(m_length == MAX_SIZE)
{
//存储空间已满,不能插入
return false;
}
for (int index = m_length-1; index >= i-1 ; index--)
{
m_data[index+1] = m_data[index];
}
m_data[i-1] = e;
m_length++;
return true;
}
(7)在顺序表中的第i个位置的元素删除,使的长度为n线性表(a(1),…,a(i-1),a(i),a(i+1)…a(n))变成长度为n-1的线性表(a(1),…,a(i-1),a(i+1),…,a(n))
bool delete_element(int i)
{
if (i<1 || i>m_length)
{
return false;
}
for (int index = i-1; index < m_length-1; index++)
{
m_data[index]=m_data[index+1];
}
m_length--;
return true;
}
5. 将全部代码封装在SQList的模板类中,实现如下所示:
// An highlighted block
#ifndef __SQ_LIST_H__
#define __SQ_LIST_H__
#define MAX_SIZE 512 //顺序表最大可以达到的长度
namespace SQLIst
{
//用模板表数据类型,线性表中可以存储不同的数据类型,根据用户实际使用的需要的类型:int,float,char,string,double或者自定义的结构体
template<class T>
class CSQ_List
{
private:
T* m_data; //存储空间的基地址
int m_length; //当前长度
public:
//构造函数,初始化存储空间的基地址为NULL,线性表当前长度为0
CSQ_List():m_data(NULL),m_length(0)
{
}
//析构时,要释放分配的存储空间
~CSQ_List()
{
if(m_data)
{
delete[] m_data;
}
}
//顺序表的初始化,为顺序表动态分配一个MAX_SIZE大小存储空间,并且让m_data指向这个储存空间的基地址。
bool create_list()
{
//构造一个空的顺序表
m_data = new T[MAX_SIZE];
if(!m_data)
{
return false;
}
return true;
}
//取值操作,指定位置序号,获取顺序表中第i个元素的值
bool get_element(int i,T& e)
{
if(i<1 || i> m_length)
{
return false;
}
e = m_data[i-1];
return true;
}
//获取顺序表中当前元素的个数
int get_length()
{
return m_length;
}
//查找操作,查找到顺序表中第1个与指定元素e相等的元素,若查找返回该元素的位置序号,若查找失败则返回0
int find_element(const T& e)
{
//在顺序表中查找值为e的元素,返回其序号
for(int i=0;i<m_length;i++)
{
if(m_data[i]==e)
{
return (i+1);
}
}
return 0;
}
//在顺序表的中追加元素
bool push_back(const T& e)
{
return insert_element(m_length+1,e);
}
//在顺序表中的第i个位置插入元素e,使的长度为n线性表(a(1),...,a(i-1),a(i+1),...,a(n))变成长度为n-1的线性表(a(1),...,a(i-1),e,a(i),...a(n))
bool insert_element(int i,const T& e)
{
if(i<1 || i>(m_length+1))
{
return false;
}
if(m_length == MAX_SIZE)
{
//存储空间已满,不能插入
return false;
}
for (int index = m_length-1; index >= i-1 ; index--)
{
m_data[index+1] = m_data[index];
}
m_data[i-1] = e;
m_length++;
return true;
}
//在顺序表中的第i个位置的元素删除,使的长度为n线性表(a(1),...,a(i-1),a(i),a(i+1)...a(n))变成长度为n-1的线性表(a(1),...,a(i-1),a(i+1),...,a(n))
bool delete_element(int i)
{
if (i<1 || i>m_length)
{
return false;
}
for (int index = i-1; index < m_length-1; index++)
{
m_data[index]=m_data[index+1];
}
m_length--;
return true;
}
};
}
#endif
下面是对CSQList顺序表的测试代码
#include"SQ_List.h"
using namespace SQLIst;
int main()
{
CSQ_List<int> list;
if(list.create_list())
{
list.push_back(1);
list.push_back(2);
list.push_back(3);
int value = 0;
for(int i=1;i<=list.get_length();i++)
{
if(list.get_element(i,value))
{
printf("%d\n",value);
}
}
}
return 0;
}