线性表是一种线性结构。所谓线性结构是指数据元素与自然数之间存在着一对一的关系,这里的一对一并一定只得是一个数据,而是从抽象角度来说的集合,两个集合之间的元素两两相互对应。
废话不多说,上代码
#include<iostream>
using namespace std;
const int LIST_SIZE = 5000;
class ELEM {//存储的表元素(自定义数据)
private:
int key;
public:
ELEM() {
this->key = 0;
}
ELEM(int key) {
this->key = key;
}
int getKey() {
return key;
}
void setKey(int key) {
this->key = key;
}
};
class list {
private:
int msize;//表的最大长度
int numinlist;//表中元素的实际个数
int curr;//表中当前元素的位置
ELEM* listarray;//存储表元素的数组
public:
list(int sz = LIST_SIZE);//构造函数
~list();
void clear();//清空表中所有元素
void insert(ELEM&);//在当前位置插入一个元素
ELEM remove();//删除并返回当前元素的值
void setFirst();//将光标放在第一个位置
void prev();//移动光标到前一个位置
void next();//移动光标到下一个位置
int length();//返回表的当前长度
void setPos(int);//置光标于指定位置
void setValue(ELEM&);//设置当前元素的值
ELEM currValue();//返回当前元素的值
bool isEmpty();//判断是否为空
bool isInList();//如果光标在表内则为真
bool find(ELEM&);//从当前位置寻找元素的值
};
list::list(int sz) {
msize = sz;
numinlist = curr = 0;
}
list::~list() {
delete[] listarray;//释放所有空间
}
void list::clear() {
delete[] listarray;
numinlist = curr = 0;
}
void list::insert(ELEM& item) {
if (numinlist >= msize)
{
cout << "线性表已满,插入失败!\n";
return;
}
else if ((curr < 0) || (curr > numinlist)) {
cout << "线性表插入位置不合适,插入失败" << endl;
return;
}
for (int i = numinlist; i > curr; i--) {
listarray[i] = listarray[i - 1];
}
listarray[curr] = item;
numinlist++;
}
ELEM list::remove() {
if (!isEmpty() && isInList()) {
ELEM temp = listarray[curr];
for (int i = curr; i < numinlist; i++) {
listarray[i] = listarray[i + 1];
}
numinlist--;
return temp;
}
else {
cout << "待删除的元素不在表中,删除错误" << endl;
return;
}
}
void list::setFirst() {
curr = 0;
}
void list::prev() {
curr--;
}
void list::next() {
curr++;
}
int list::length() {
return numinlist;
}
void list::setPos(int pos) {
curr = pos;
}
void list::setValue(ELEM& val) {
if (isInList()) {
listarray[curr] = val;
}
else {
cout << "当前操作位置不存在表的范围内" << endl;
}
}
ELEM list::currValue() {
if (isInList()) {
return listarray[curr];
}
else {
cout << "当前操作位置不在表的范围内" << endl;
exit(1);
}
}
bool list::isEmpty() {
return numinlist == 0;//如果为空则返回零,在这里可以写return if(numinlist)
}
bool list::isInList() {
return (curr >= 0) && (curr < numinlist);
}
bool list::find(ELEM& val) {
while (isInList()) {
if (currValue().getKey() == val.getKey()) {
return true;}
else next();
return false;
}
}
上面的代码为c++版本的数组线性表,鉴于线性表从抽象角度而言比较容易理解,便不在此继续赘述。如果实在不能理解,可以把线性表想象成我们c语言中学过的数组,一个元素(例如数值)对应了一个下标,我认为这应该是抽象程度不算太高的线性表。