一、实验目的
1、熟练掌握线性表的结构特点,掌握顺序表的基本操作。
2、巩固 C++相关的程序设计方法与技术。
3、学会使用顺序表解决实际问题。
二、实验内容
1、顺序表的建立与操作实现
建立 n 个元素的顺序表(n 的大小和表里数据自己确定),实现相关的操作:输出,插
入,删除,查找等功能。编写完整程序实现,程序语言不限定,使用技术形式不定。
三、实验步骤
1、依据实验内容分别说明实验程序中用到的数据类型的定义;
2、相关操作的算法表达;
查找操作:
(1)按位查找
顺序表中第i个元素存储在数组中下标为i-1的位置上,所以返回数组下标为i-1 的元素即可
实现按位查找,按位查找的时间复杂度为O(1)。
(2)按值查找
对顺序表的元素依次进行比较,如果成功,则返回元素的序号,若不成功,则返回查找失败的标志“0”,按值查找的时间复杂度为O(n)。
插入操作:
在表中第i个位置插入一个新元素,将最后元素直至第i个元素分别向后移动一个位置,将要插入的元素x插入位置i处,并将表长+1。如果表满了,则抛出上溢异常;若插入位置不合理,则抛出位置异常。
删除操作:
将表中的第i个元素,在移动前先将此元素取出,将下标为i,i+1...n-1处的元素分别移到下标为i-1,i...n-2处,表长减1,返回被删元素值。如果表空,则下溢异常,若元素被删元素不合理,则会引发删除位置异常。
3、完整程序;
源程序代码:
#include <iostream>
using namespace std;
const int MaxSize=100;
template <class DataType> // 定义模板类SeqList
class SeqList
{
public:
SeqList(){length=0;} //无参构造函数,建立一个空的顺序表
SeqList(DataType a[],int n); //有参构造函数,建立一个长度为n的顺序表
~SeqList(){} //析构函数
int Length (){return length;} //求线性表的长度
DataType Get(int i); //按位查找,在线性表中查找第i个元素
int Locate(DataType x); //按值查找,在线性表查找值为x的元素符号
void Insert(int i,DataType x); //插入,在线性表中第i个位置插入值为x的元素
DataType Delete(int i); //删除,删除线性表的第i个元素
void PrintList(); //遍历操作,按序依次输出各元素
private:
DataType data[MaxSize]; //存放数据元素的数组
int length; //线性表的长度
};
template <class DataType>
SeqList<DataType>::SeqList(DataType a[],int n)
{
DataType i;
if(n>MaxSize)throw"参数非法";
for(i=0;i<n;i++)
data[i]=a[i];
length=n;
}
template <class DataType>
DataType SeqList<DataType>::Get(int i)
{
if(i<1 && i>length) throw"查找位置非法";
else return data[i-1];
}
template <class DataType>
int SeqList<DataType>::Locate(DataType x)
{
DataType i;
for(i=0;i<length;i++)
if(data[i]==x) return i+1;
return 0;
}
template <class DataType>
void SeqList<DataType>::Insert(int i,DataType x)
{
DataType j;
if(length>=MaxSize)throw"上溢";
if(i<1||i>length+1)throw"位置";
for(j=length;j>=i;j--)
data[j]=data[j-1]; //第j个元素存在于数组下标为j-1处
data[i-1]=x;
length++;
}
template <class DataType>
DataType SeqList<DataType>::Delete(int i)
{
DataType x,j;
if(length==0)throw"下溢";
if(i<1||i>length)throw"位置";
x=data[i-1];
for(j=i;j<length;j++)
data[j-1]=data[j];
length--;
return x;
}
template <class DataType>
void SeqList<DataType>::PrintList()
{
DataType i;
for(i=0;i<length;i++)
cout<<data[i];
}
int main()
{
cout<<endl<<"\t\t\t\t\t**********顺序表的实现(模板类)**********"<<endl<<endl;
cout<<"\t\t\t\t\t * 1——按位查找 *"<<endl;
cout<<"\t\t\t\t\t * 2——按值查找 *"<<endl;
cout<<"\t\t\t\t\t * 3——插入 *"<<endl;
cout<<"\t\t\t\t\t * 4——删除 *"<<endl;
cout<<"\t\t\t\t\t * 5——输出顺序表 *"<<endl;
cout<<"\t\t\t\t\t * 6——输出表长 *"<<endl;
cout<<"\t\t\t\t\t * 7——退出 *"<<endl;
int arr[]={87,77,90,68,98,80};
int flag,ins_loc,x,tab,len;
flag=0;
SeqList<int>List(arr,6);
while(flag==0)
{
cout<<endl<<"输入编号:"<<endl;
cin>>tab;
switch(tab)
{
case 1:{cout<<endl<<"输入元素位置:"<<endl;
cin>>ins_loc;
x=List.Get(ins_loc);
cout<<endl<<"查找的数是:"<<x<<endl;
break;
}
case 2:
{
cout<<endl<<"输入你想要查找的数:"<<endl;
cin>>x;
ins_loc=List.Locate(x);
cout<<endl<<"这个数所在的位置是:"<<ins_loc<<endl;
break;
}
case 3:
{
cout<<endl<<"输入你要插入的数的位置:"<<endl;
cin>>ins_loc;
cout<<endl<<"输入你要的插入的数:"<<endl;
cin>>x;
List.Insert(ins_loc,x);
break;
}
case 4:
{
cout<<endl<<"输入你要删除的位置 :"<<endl;
cin>>ins_loc;
cout<<List.Delete(ins_loc);
break;
}
case 5:
{
List.PrintList();
break;
}
case 6:
{
len=List.Length();
cout<<endl<<"the length is:"<<len<<endl;
break;
}
case 7:
{
flag=1;
break;
}
default:
{
cout<<"the command is not found!"<<endl;
break;
}
}
}
return 0;
}
4、运行结果和分析。
(1)主界面:
(2)输出顺序表,输出表长,退出
(3)按位查找及按值查找
(4)插入,并输出插入成功的顺序表
(5)删除操作,并输出删除成功的顺序表
5、总体收获和不足,疑问等。
这个实验我使用了C++模板类来实现顺序表的基本操作,通过这个实验,我初步掌握了顺序表的建立及基本操作的知识,但在实验过程也发现了自己的许多不足之处,比如虽然使用模板类来进行实验,但由于模板类的知识是上学期学的,没有及时进行复习,导致在类模板的定义时使用类型参数出错,删除和插入操作无法运行。通过这个实验,我认识到在进行学习新知识时,也要及时进行旧知识的复习。