实验一 线性表的基本操作实现

来源:互联网 发布:淘宝客服中心设置 编辑:程序博客网 时间:2024/06/05 04:40

1、实验目的

         学习线性表的顺序存储结构,掌握线性表的建立,查找,插入,删除和输出等基本操作。

2、实验内容

         用C++的模板机制来实现线性表的基本操作

学习掌握线性表的顺序存储结构、链式存储结构的设计与操作。对顺序表建立、

插入、删除的基本操作,对单链表建立、插入、删除的基本操作算法。

3、实验中用到的数据类型的定义:抽象数据类型

        在程序中,定义了一个类模板 template<class DataType>,在该类中有 DataType data[MaxSize] 和length两个私有成员,分别表示该类中存放数据元素的数组和线性表的长度;定义了构造函数SeqList()和析构函数~SeqList(),还有对列表进行求线性表的长度、输出、查找、插入以及删除等操作的函数。


4、相关操作的算法表达

(1)顺序表有参构造函数SeqList

template <class DataType>
SeqList<DataType>::SeqList(DataType a[],int n)
{
int i;
if(n>MaxSize) 
throw "非法参数";
for(i=0;i<n;i++)
data[i]=a[i];
length=n;
}

(2)顺序表按位查找算法Get
template <class DataType>    //按位查找
DataType SeqList<DataType>::Get( int i)
{
if(i<1||i>length) 
throw"查找位置非法";
else return data[i-1];
}

(3)顺序表按值查找算法Locate

template <class DataType>    //按值查找
int SeqList<DataType>::Locate(DataType x)
{
int i;
for(i=0;i<length;i++)
if(data[i]==x) return i+1;
return 0;                //查找失败,退出循环
}

(4)顺序表插入算法Insert
template <class DataType>
void SeqList<DataType>::Insert(int i,DataType x)
{
int j;
if(length>=MaxSize) 
throw"上溢";
if(i<1||i>length+1) 
throw"位置异常";
for(j=length; j>=i;j--)
data[j]=data[j-1];
data[i-1]=x;
length++;
}

(5)顺序表删除算法Delete
template <class DataType>
DataType SeqList<DataType>::Delete(int i)
{
int 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;
}

(6)顺序表遍历算法PrintList
template <class DataType>   
void SeqList<DataType>::PrintList()
{
int i;
for(i=0;i<length;i++)
cout<<" "<<data[i];
}


5、源代码

#include<iostream>
using namespace std;
const int MaxSize=100;
template<class DataType>
class SeqList
{
public:
SeqList(){ length=0; }            //建立空的顺序表
SeqList(DataType a[],int n);      //建立长度为n的顺序表
~SeqList(){}                      //建立析构函数
int Length(){ return length;}     //求线性表的长度
DataType Get( int i);             //按位置查找
int Locate(DataType x);           //按值查找
void Insert(int i,DataType x);    //在位置i插入x
DataType Delete(int i);           //删除
void PrintList();                 //输出
private:
DataType data[MaxSize];           //存放数据元素的数组
int length;                       //线性表的长度
};


template <class DataType>
SeqList<DataType>::SeqList(DataType a[],int n)
{
int 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)
{
int 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)
{
int j;
if(length>=MaxSize) 
throw"上溢";
if(i<1||i>length+1) 
throw"位置异常";
for(j=length; j>=i;j--)
data[j]=data[j-1];
data[i-1]=x;
length++;
}


template <class DataType>
DataType SeqList<DataType>::Delete(int i)
{
int 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()
{
int i;
for(i=0;i<length;i++)
cout<<" "<<data[i];
}


int main()
{
cout<<"\t ******************顺序表的实现**********************\n";
cout<<"\t ****************************************************\n";
cout<<"\t *------------------------------------------*********\n";
cout<<"\t ***********[1]——顺序表求线性表的长度**************\n";
cout<<"\t ***********[2]——顺序表按位查找算法****************\n";
cout<<"\t ***********[3]——顺序表按值查找算法****************\n";
cout<<"\t ***********[4]——顺序表插入算法********************\n";
cout<<"\t ***********[5]——顺序表删除算法********************\n";
cout<<"\t ***********[6]——顺序表遍历算法********************\n";
cout<<"\t ***********[7]——输出主菜单************************\n";
cout<<"\t ***********[8]——退出******************************\n";
cout<<"\t *------------------------------------------*********\n";
cout<<"\t ****************************************************\n";

int a[]={12,23,34,45,56,67,78,89,90,01};
int flag,i,x,t,l;
flag=0;
SeqList<int>List(a,10);
while(flag==0)
{
cout<<"请输入指令数字(输入7可以得到主菜单):"<<endl;
cin>>t;
switch(t)
{
case 1:
l=List.Length();
cout<<"线性表的长度为:"<<l<<endl;
break;                                                         
case 2:
cout<<"请输入要查找的位置:"<<endl;
cin>>i;
x=List.Get(i);
cout<<"该内容为:"<<x<<endl;
break;
case 3:
cout<<"请输入想要查找的数:"<<endl;
cin>>x;
i=List.Locate(x);
cout<<"该数的位置为:"<<i<<endl;
break;
case 4:
cout<<"请输入要插入的位置:"<<endl;
cin>>i;
cout<<"请输入要插入的数:"<<endl;
cin>>x;
List.Insert(i,x);
cout<<"插入成功!"<<endl;
break;
case 5:
cout<<"请输入想要删除的位置:"<<endl;
cin>>i;
List.Delete(i);
cout<<"删除成功!"<<endl;
break;
case 6:
List.PrintList();
cout<<endl;
break;
case 7:
cout<<"\t ****************************************************\n";
cout<<"\t *------------------------------------------*********\n";
cout<<"\t ***********[1]——顺序表求线性表的长度**************\n";
cout<<"\t ***********[2]——顺序表按位查找算法****************\n";
cout<<"\t ***********[3]——顺序表按值查找算法****************\n";
cout<<"\t ***********[4]——顺序表插入算法********************\n";
cout<<"\t ***********[5]——顺序表删除算法********************\n";
cout<<"\t ***********[6]——顺序表遍历算法********************\n";
cout<<"\t ***********[7]——输出主菜单************************\n";
cout<<"\t ***********[8]——退出******************************\n";
cout<<"\t *------------------------------------------*********\n";
cout<<"\t ****************************************************\n";
break;
case 8:
{
flag=1;
break;
}
default:
{
cout<<"没有发现此命令!"<<endl;
break;
}
}
}
return 0;
}


6、总结、运行结果和分析

在主函数中,创建一个长度为10的数组


当程序运行时,出现主菜单,可以根据主菜单的数字选择相应的功能。


输入“1”,输出线性表的长度


输入“2”,系统提示“请输入要查找的位置”,如果位置输入正确,会输出该位置的内容。

   

如果位置输入错误,会跳出提示框。


输入“3”,提示“请输入要查找的数”,如果查找成功,返回元素的序号,如果查找失败,返回“0”。

             

输入“4”,向线性表中插入元素。成功插入则会提示:“插入成功!”

 

如果插入的位置不合理,会跳出提示框。


5、输入“5”,选择想要删除的位置。

     

6、输入“6”,依次输出线性表的元素值


7、输入“7”,输出主菜单


8、输入“8”,退出程序



7、总结与不足

在一开始看到老师给的任务时,内心是茫然的,之前学过的C语言和C++都忘得差不多了,连类模板是怎么用的也忘了。完全不知道要怎么入手,于是又回去看C++的书,发现自己的基础真的是掌握得不好,学了跟没学一样,十分惭愧。然后开始敲代码,先是将参照书上将各个函数敲下来,结果不知道为什么编译过后在链接(build)那里一直出错,问了舍友发现她们的并没有出现这种情况,于是又换了个编程软件dev c++,结果可能因为电脑问题无法使用,于是卸了vc6.0再重下,再试了几遍后突然没问题了,就又继续奋斗了。虽然勉勉强强程序可以运行,但还是有些地方并不怎么明白,比如说在按位查找时,虽然当输入错误的时候会有跳出一个提示框,但是并不知道那跟程序里面的 throw 是不是一样的······总而言之,基础不扎实,仍需多多努力。

阅读全文
0 0
原创粉丝点击