实验一 线性表的基本操作实现
来源:互联网 发布:淘宝客服中心设置 编辑:程序博客网 时间: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 是不是一样的······总而言之,基础不扎实,仍需多多努力。
- 实验一、线性表的基本操作及实现
- 实验一 线性表的基本操作实现
- 实验一线性表的基本操作实现及其应用
- 实验一 线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一 线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一 线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一 线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- Python3 解决编码问题: `UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 10: ille
- Netty——LengthFieldBasedFrameDecoder
- Java.学习之旅package和import总结
- vscode 中 安装插件 vetur 之后报错 The Vue Language Server server crashed 5 times in the last 3 minutes. The s
- Jenkins+SVN+Maven+Shell 实现项目一键发布
- 实验一 线性表的基本操作实现
- js和jQuery的AJAX实现
- 循环语句的应用(for)
- Untiy学习 简单的脚本方法
- 青岛往事-番外
- 二分法求解Leetcode 34. Search for a Range
- 线性与非线性
- Spring中配置数据源的4种形式(含有如何在spring框架中解决多数据源的问题)
- 伯努利分布、二项分布