在数据结构中,线性表是非常重要的一种存储结构,线性表有两种存储结构:顺序存储结构和链式存储结构,这两种都能用来存储线性表。
今天写了一个顺序存储的类的设计和实现,改天再补上相应的一些应用,以及链表的类和实现。
该文件放在SeqList.h文件中,主要的功能有:
初始化线性表,撤销顺序表所占的空间,判断顺序表是否为空或已满,求表的实际长度,求取表中指定位置的值,设置指定位置的值,定位,插入一个元素值,删除一个元素值,查找等。
2015.10.29更新
<pre name="code" class="cpp">/*本头文件定义一个顺序表类*/
#ifndef SeqList_H_
#define SeqList_H_
#include <iostream>
using namespace std;
class SeqList
{
private:
int *table; //指向数组的指针
int size; //顺序表的数组容量
int len; //顺序表的实际长度
public:
SeqList(int n=0); //容量初始化为0
~SeqList(void); //析构函数
bool isEmpty()const; //判断顺序表是否为空
bool isFull()const; //判断顺序表是否已满
int length()const; //返回顺序表的实际长度
int get(int i)const; //返回第i个数据元素值
bool set(int i,int k); //设置第i个数据元素值为k
bool insert(int i,int k); //插入k值作为第i个数据元素
bool insert(int k); //将k值插入到顺序表最后,函数重载
int search(int k); //查找,返回k值首次出现的位置
bool remove(int k); //删除k值首次出现的位置
void output(); //按实际长度输出顺序表的数据元素
bool create(int n); //顺序表中添加n个自然数
};
//顺序表的初始化
SeqList::SeqList(int n)
{
table = new int[n]; //为顺序表开辟n个存储单元
size = n;
len = 0; //顺序表的实际长度为0
}
//撤销顺序表的对象
SeqList::~SeqList(void)
{
delete []table;
}
//判断顺序表是否为空,即n=0时为空
bool SeqList::isEmpty()const
{
return len==0;
}
//判断顺序表是否已满,即n>=size的情况
bool SeqList::isFull()const
{
return len>=size;
}
//返回顺序表的长度
int SeqList::length()const
{
return len;
}
//获得顺序表第i个位置数据元素
int SeqList::get(int i)const
{
if(i>0&&i<=len)
return table[i-1];
else
return -1;
}
//设置顺序表第i个位置的数据元素
bool SeqList::set(int i,int k)
{
if (i>0&&i<=len+1)
{
table[i-1]=k;
return true;
}
else
return false;
}
//查找
int SeqList::search(int k)
{
int i=1;
while (i<=length()&&get(i)!=k) //先找到k的位置
i++;
if(i<=length())
return i;
else
return 0;
}
//在位置i处插入数据元素k,思路:先将i处及i处位置
//以后的元素依次向后移动一个单位,再将元素赋给i位置处
//但前提是顺序表最后还有位置,所以要先判断是否已满
bool SeqList::insert(int i,int k)
{
if(!isFull())
{ if(i<=0)i=1;
if(i>=len)i=len+1; //自动矫正输入的位置
for(int j=len-1;j>=i-1;j--)
table[j+1]=table[j]; //依次后移
table[i-1]=k; //插入元素k
len++; //长度自动加1
return true;
}
else
{
cerr<<"顺序表已满,无法插入"<<k<<"的值啊!\n";
return false;
}
}
//将k值添加到最后的操作
bool SeqList::insert(int k)
{
return insert(length()+1,k);
}
//删除顺序表的第i个数据元素,插入的逆思路
bool SeqList::remove(int k)
{
if (!isEmpty())
{
int i=search(k);
for(int j=i;j<=length();j++)
set(j,get(j+1));
len--;
return true;
}
else
{
cout<<"顺序表为空,无法删除值!\n";
return false;
}
}
void SeqList::output()
{
for(int i=0;i<length();i++)
cout<<get(i)<<"\t"<<endl;
}
bool SeqList::create(int n)
{
if(n!=0)
{
for(int i=1;i<=n;i++)
table[i-1]=i;
return true;
}
else
{
cout <<"length is 0,can't do that!\n";
return false;
}
}
#endif //SeqList_H_