顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。
顺序表的存储特点是:只要确定了起始位置,表中任一元素的地址都通过下列公式得到:LOC(ai)=LOC(a1)+(i-1)*L 1≤i≤n 其中,L是元素占用存储单元的长度。
#ifndef LIST_H
#define LIST_H
template <typename T>
class List{
public:
virtual void InitList()=0; //表初始化
virtual void DestoryList()=0; //销毁表
virtual int Length()=0; //求表长度
virtual const T & Get(int i)=0; //取表中元素
virtual int Locate(T & x)=0; //元素查找
virtual void Insert(int i,T & x)=0; //插入新元素
virtual T Delete(int i)=0; //删除元素
virtual bool Empty()=0; //判断表是否为空
virtual bool Full()=0; //判表是否满
};
#endif
#ifndef SEQLIST_H
#define SEQLIST_H
#include"List.h"
#include<iostream>
using namespace std;
template <typename T>
class SeqList : public List<T>{
template <typename T>
friend ostream & operator<<(ostream & os,const SeqList<T> & sl);
public:
SeqList(int m=20);
SeqList(T ary[],int n,int max);
~SeqList(){
DestoryList();
delete [] ptr;
}
virtual void InitList(){curLen=0;}
virtual void DestoryList(){curLen=-1;max=0;}
virtual int Length(){return curLen;}
virtual T Get(int i); //取表中元素
virtual int Locate(T & x); //元素查找
virtual void Insert(int i,T & x); //插入新元素
virtual T Delete(int i); //删除元素
virtual bool Empty(){return curLen==0;} //判断表是否为空
virtual bool Full(){return curLen==max;} //判表是否满
private:
T * ptr;
int curLen;
int max;
};
template <typename T>
SeqList<T>::SeqList(int m){
max=m
curLen=0;
ptr=new T[max];
}
template <typename T>
SeqList<T>::SeqList(T ary[],int n,int max){
this->max=max;
curLen=0;
ptr=new T[max];
while(curLen<n){
ptr[curLen]=ary[curLen];
curLen++;
}
}
template <typename T>
T SeqList<T>::Get(int i){
if (i>=1 && i<=curLen)
return ptr[i-1];
else
throw "元素位置错误!";
}
template <typename T>
int SeqList<T>::Locate(T & x){
for (int i=0;i<curLen; i++)
if (ptr[i]==x)
return i+1;
return 0;
}
template <typename T>
void SeqList<T>::Insert(int i,T & x){
if(Full())
throw "顺序表已满!";
if(i<1 || i>=curLen+1)
throw "插入位置错误!";
for(int j=curLen;j>=i;j--)
ptr[j]=ptr[j-1];
ptr[i-1]=x;
curLen++;
}
template <typename T>
T SeqList<T>::Delete(int i){
T tmp;
if(Empty())
throw "顺序表空!";
if(i<1 || i>=curLen)
throw "删除位置错误!";
tmp=ptr[i-1];
for(int j=i-1;j<curLen-1;j++)
ptr[j]=ptr[j+1];
curLen--;
return tmp;
}
template <typename T>
ostream & operator<<(ostream & os,const SeqList<T> & sl){
for(int i=0;i<sl.curLen;i++)
os<<sl.ptr[i]<<", ";
return os;
}
#endif
#include<iostream>
#include"SeqList.h"
using namespace std;
int main(){
int ary[]={4,7,2,9,10,43,6},x=10,l;
SeqList<int> myList(ary,7,10);
cout<<myList<<endl;
try{
myList.Insert(7,x);
cout<<myList<<endl;
}catch(char * s){
cout<<s<<endl;
}
try{
myList.Delete(40);
cout<<myList<<endl;
}catch(char * s){
cout<<s<<endl;
}
cout<<"请依次输入插入元素的位置和值:";cin>>l>>x;
while(1){
try{
myList.Insert(l,x);
cout<<myList<<endl;
cout<<"请依次输入插入元素的位置和值:";cin>>l>>x;
}catch(char * s){
cout<<s<<endl;
break;
}
}
cout<<myList<<endl;
return 0;
}