顺序表
定义
顺序存储的线性表,把线性表的元素按逻辑顺序依次顺序存放在一组地址连续的存储单元里。
使用C++中的类来建立顺序存储
#include<iostream>
#include<cstdlib>
#include<iomanip>
using namespace std;
const int MaxListSize=100;
typedef int DataType;
class SeqList
{
private:
DataType *data;
int size;//元素的个数
public:
SeqList();
void Create(int n);//输入n个数值构造n个节点
void Print();//输出函数
/*List(){
} //构造一个空的线性表*/
void Clear();
bool IsEmpty();
bool IsFull();
DataType GetElem(int k)//按索引回线性表中的元素
{
return data[k];//返回第K个位置的数据元素
}
int Locate(DataType e);//返回第一个与元素e匹配的位序
//DataType GetPrior(DataType e);//返回元素e的前驱
// DataType GetNext(DataType e);//返回元素e的后继
void Insert(DataType e,int i);//在第i个位置插入元素e,
DataType DeleteById(int i);//删除第i个元素,并返回其值
bool DeleteByData(DataType e);//按元素值删除元素
};
SeqList::SeqList(){
data=new DataType[MaxListSize];
size=0;
}
void SeqList::Create(int n){
if(n<1||n>MaxListSize){
cout<<"输入的数目不符合规范"<<endl;
exit(0);
}
for(int i=0;i<n;i++){
cout<<"输入第"<<i+1<<"个数据"<<endl;
cin>>data[i];
}
size=n;
}
void SeqList::Print(){
if(size>0){
cout<<"表中数据为:"<<endl;
for(int i=0;i<size;i++){
cout<<setw(5)<<data[i];
}
cout<<endl;
}
else{
cout<<"表中无数据"<<endl;
}
}
void SeqList::Clear(){
}
bool SeqList::IsEmpty(){
if(size==0){
return true;
}
else{
return false;
}
}
bool SeqList::IsFull(){
if(size==MaxListSize)
return true;
else
return false;
}
int SeqList::Locate(DataType e) {
int i=0;
while(i<size&&data[i]!=e)
{
i++;
}
if(i>=size)
return -1;//没有找到返回-1
else
return i;//找到元素返回其下标
}
//DataType SeqList::GetPrior(DataType e)
// DataType SeqList::GetNext(DataType e)
void SeqList::Insert(DataType e,int i){
if(i<0||i>size||size==MaxListSize-1){
//插入位置错误,或者链表已满
cout<<"插入位置错误,或者链表已满"<<endl;
return ;
}
else {
size++;
for(int j=size;j>i;j--) {
data[j]=data[j-1];
}
data[i]=e;
}
}
DataType SeqList::DeleteById(int i) {
if(i<0||i>=size)
{
return -1;
}
else
{
size--;
int e=data[i];
for(int j=i;j<size;j++)
{
data[j]=data[j+1];
}
return e;
}
}
bool SeqList::DeleteByData(DataType e){
int i=0;
while(data[i]!=e&&i<size)
i++;
if(i==size){
cout<<"线性表中无此元素"<<endl;
return false;
}
for(int k=i;k<size;k++){
data[k]=data[k+1];
}
size--;
return true;
}
int main()
{
SeqList sql;
cout<<"请输入链表的长度:"<<endl;
int n=0;
cin>>n;
sql.Create(n);
sql.Print();
/* cout<<"请输入想查找的位置:"<<endl;
int dat=0;
cin>>dat;
cout<<"查找的位值为:"<<sql.GetElem(--dat)<<endl;*/
/*cout<<"请输入要插入的元素和位置:"<<endl;
DataType e=0;
int i=0;
cin>>e>>i;
sql.Insert(e,i);
cout<<"打印插入后的元素信息:"<<endl;
sql.Print();*/
/* cout<<"删除数组中下标为2的位置):"<<endl;
sql.DeleteById(2);
cout<<"打印删除后的信息"<<endl;
sql.Print();*/
/*cout<<"删除数组值为5的元素):"<<endl;
sql.DeleteByData(5);
cout<<"打印删除后的信息"<<endl;
sql.Print();*//* 在这个删除中有个BUG,数组中如果有多个重复值,只能删除第一个出现的值*/
return 0;
}
关于Locate()方法的算法分析:
定位算法的时间复杂度
基本操作:比较
最好情况:比较1次(i=0),时间复杂度为O(1)
最坏情况:比较n次(i=n-1),时间复杂度为O(n)
平均情况:设定位每个数据元素的概率相等,则在线性表中查找值为e的元素所需要比较的平均次数为
关于Insert()方法的算法分析:
插入算法的时间复杂度
基本语句:移动元素
最好情况:不移动(i=n),时间复杂度为O(1)
最坏情况:移动 n 个元素(i=0),时间复杂度为O(n)
平均情况:设插入每个数据元素的概率相等,
参考书籍《数据结构与算法》,考研冲冲冲!!