您的位置:首页 > 编程语言 > C语言/C++

算法总结笔记之一——线性表(1)基本实现【C++语言】

2017-04-27 20:48 453 查看
 线性表是一种以数组形式来实现的数据结构,先给出抽象定义:

ADT list

insert(x, s) 在s处插入数据x

erase(s) 删除s处的数据

get(s) 读写s处的数据

length() 线性表的长度

clear() 清空线性表

endADT

线性表有两种表示方法:一般数组和面对对象,为了熟悉STL,这里介绍面对对象的方法,先开发类simplelist作为接口:

template <class T>
class simplelist
{
public:
virtual void insert(const T& x, const int s) = 0;
virtual void erase(const int s) = 0;
virtual T& get(const int s) = 0;
virtual int length() = 0;
virtual void clear() = 0;
};


常量定义:

#define UNDERLOW -32768
#define DataUnfound "No such data!"


根据类simplelist, 先开发最简单的arraylist:

template <class T>
class arraylist : public simplelist<T>
{
T* data;
int len;
public:
arraylist(int size = 10) {data = new T[size]; len = 0;}
void insert(const T& x, const int s);
void erase(const int s);
T& get(const int s);
int length() {return len;}
void clear();
};


首先是线性表的插入操作,将编号为s及以后的数据后移,可是这里数组长度有可能不够,故要先编一个数组变长的函数:
template <class T>
void changeLength(T oldData[], int oldsize, int newsize)
{
T newData[oldsize + 5];
copy(oldData, oldData + oldsize, newData);
delete[] oldData;
oldData = new T[newsize];
copy(newData, newData + oldsize, oldData);
}
于是就可以进行插入操作了:
template <class T>
void arraylist<T>::insert(const T& x, const int s)
{
int regsize = sizeof(this->data) / sizeof(T) - 1;
if (regsize <= len)
changeLength(data, len + 1, len + 2);
len++;
copy(data + s, data + len, data + s + 1);
data[s] = x;
}
线性表的删除 更是丝毫没有难度 简单一点,代码如下:
template <class T>
void arraylist<T>::erase(const int s)
{
copy(data + s + 1, data + len + 1, data + s);
changeLength(data, len + 1, len);
len--;
}
读写线性表中的数据:
template <class T>
T& get(const int s)
{
if (s == 0 || s > len)
throw DataUnfound;
return this->data[s];
}
清空线性表:
template <class T>
void arraylist<T>::clear()
{
delete[] this->data;
len = 0;
data = new T[10];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 算法 线性表