【C++数据结构学习笔记---线性表】用数组实现线性表
一个简单的实现例子,只用到了插入函数以及输出函数,初始化26个英文字母。
插入算法的思路:(insert)
1、线性表已满则不插入任何数据。
2、如果插入位置不合理,程序自动纠正,如插入位置小于1,则修正插入位置为1,插入位置大于length+1,则修正为length+1。
3、从最后一个元素开始向前遍历到第k个位置,分别将它们都向后移动一个位置。
4、将要插入元素填入位置k。
5、表长加1。
删除算法的思路:(erase)
1、如果删除位置不合理,则不删除任何数据。
2、从第k+1个位置开始遍历到最后一个元素,分别将它们都向前移动一个位置。
3、表长减1。
#include <iostream>
using namespace std;
#define MAX_LIST_SIZE 20
template <typename T>
class ArrList{
public:
ArrList(int max_list_size=MAX_LIST_SIZE); //构造函数
~ArrList(){delete [] data;} //析构函数
bool empty()const {return 0==length;} //判断表是否为空
int size()const {return length;} //判断表的大小
int locate(const T& x)const; //返回表中元素x的位置
bool retrieve(int k,T& x)const; //返回表中第k个元素x
ArrList<T>& insert(int k,const T& x); //在表的位置k插入元素x
ArrList<T>& erase(int k); //从表中删除位置k的元素
void print_list(); //输出表
private:
int length; //记录表长
int max_size; //表的最大长度
T *data; //记录表中的数组
};
template <typename T>
ArrList<T>::ArrList(int max_list_size)
{
max_size=max_list_size;
data=new T[max_size];
length=0;
}
template <typename T>
int ArrList<T>::locate(const T& x)const
{
for(int i=0; i<length; ++i){
if (data[i]==x) return ++i;
}
return 0;
}
template <typename T>
bool ArrList<T>::retrieve(int k,T& x)const
{
if ((k<1)||(k>length)){
return false;
}
x=data[k-1];
return true;
}
template <typename T>
ArrList<T>& ArrList<T>::insert(int k,const T& x)
{
if (length==max_size) return *this;//线性表已满
if (k<1) k=1;
if (k>length+1) k=length+1;
for(int i=length-1;i>=k-1;--i){
data[i+1]=data[i];
}
data[k-1]=x;
++length;
return *this;
}
template <typename T>
ArrList<T>& ArrList<T>::erase(int k)
{
if ((k<1)||(k>length)) return *this;
if (0==length) return *this;
for(int i=k;i<length;++i){
data[k-1]=data[k];
}
--length;
return *this;
}
template <typename T>
void ArrList<T>::print_list()
{
for(int i=0;i<length;i++){
cout <<data[i] <<" ";
}
}
int main()
{
int s1,s2;
ArrList<char> s(30);
s1='A';
s2='Z';
for(int i=s2;i>=s1;--i){
s.insert(0,i);
}
s.print_list();
return 0;
}