一、实验目的
1、熟练掌握线性表的结构特点,掌握顺序表的基本操作。
2、巩固 C++相关的程序设计方法与技术。
3、学会使用顺序表解决实际问题。
二、实验内容
1、顺序表的建立与操作实现建立 n 个元素的顺序表(n 的大小和表里数据自己确定),实现相关的操作:输出,插
入,删除,查找等功能。编写完整程序实现,程序语言不限定,使用技术形式不定。2、实际问题的解决(*)
使用顺序表来实现约瑟夫环问题。
三、实验步骤
1、依据实验内容分别说明实验程序中用到的数据类型的定义;
2、相关操作的算法表达;
3、完整程序;
4、总结、运行结果和分析。
5、总体收获和不足,疑问等。
四、实验要求
1、按照数据结构实验任务书,提前做好实验预习与准备工作。
2、加“*”为选做题。做好可加分。
3、严格按照数据结构实验报告模板和规范,及时完成实验报告。
4、在个人主页上发文章
五、实验算法实现
1,定义模板类SeqLIst
class SeqList
{
public:
SeqList(){length=0;}//无参构造函数,建立一个空表
SeqList(int a[],int n);//有参构造函数
~SeqList(){}//析构函数
void Insert(int i,int x);//在线性表第i个位置插入值为x的元素
int Delete(int i);//删除线性表的第i个元素
int Locate(int x);//求线性表中值为x的元素序号
void PrintList();//按照序号依次输出各元素
private:
int data[MaxSize];//存放数组元素的数组
int length;//线性表的长度
};
(2)构造函数:无参构造函数建立一个空表,并给length赋值0;有参构造函数建立一个长度为n的顺序表,给length赋值
n;并把给定的数组元素作为顺序表的元素传入顺序表中。
(3)获取线性表的长度:成员函数返回length的值。
(4)按序号查找元素:查找顺序表的第i个元素只需返回类中数组下标为(i-1)的元素,注意查找位置要在顺序表序号范
围内,否则抛出异常。
(5)插入元素:若表满了或元素插入位置不在范围之内则抛出异常。插入时,将最后一个元素到第i个元素依次往后移一个
位置,再把x插入第i个位置;最后顺序表的长度加1。
(6)删除元素:若表是空表或删除元素位置不在范围之内则抛出异常。删除时把第i+1个元素到最后一个元素依次往前移一
个位置,最后线性表的长度-1。
(7)遍历顺序表:依次打印线性表的数据元素。
六、实验代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
#include<iostream>
using namespace std;
const int MaxSize=10;
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; //线性表的长度
};
//#include <iostream>
//using namespace std;
//#include"SeqList.h"
//顺序表有参构造函数SeqList SeqList
template<class DataType>
SeqList<DataType>::SeqList(DataType a[],int n)
{
if(n>MaxSize)throw"error";
for(int i=0;i<n;i++)
data[i]=a[i];
length=n;
}
//顺序表按值查找算法Get
template<class DataType>
DataType SeqList<DataType>::Get(int i)
{
if(i<1 && i>length)throw"查找位置非法";
else return data[i-1];
}
//顺序表按位查找算法Locate//记得删除掉这些算法
template<class DataType>
int SeqList<DataType>::Locate(DataType x)
{
for(int i=0;i<length;i++)
if(data[i]==x) return i+1; //下表为1的元素等于i,返回其序号i+1;
return 0; //退出循环,说明查找失败
}
//顺序表插入算法Insert
template<class DataType>
void SeqList<DataType>::Insert(int i,DataType x)
{
if(length>=MaxSize)throw"上溢";
if(i<1||i>length+1)throw"插入位置非法";
for(int j=length;j>=i;j--)
data[j]=data[j-1]; //第j个元素存在于数组下标为j-1处
data[i-1]=x;
length++;
}
//顺序表删除算法Delete
template<class DataType>
DataType SeqList<DataType>::Delete(int i)
{
if(length==0)throw"下溢";
if(i<1||i>length)throw"查找位置非法";
DataType x=data[i-1]; //取出位置i的元素
for(int j=i;j<length;j++)
data[j-1]=data[j]; //此处j已经是元素所在的数组下标
length--;
return x;
}
//顺序表遍历算法PrintLIst
template<class DataType>
void SeqList<DataType>::PrintList()
{
for(int i=0;i<length;i++)
cout<<data[i]; //依次输出线性表的元素值
}
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
#include<iostream>
using namespace std;
int main()
{
int score[5]={1 ,2 ,3 ,4 ,5};
SeqList<int>ScoreList(score,5);
cout<<"执行插入操作前的数据为:"<<endl;
ScoreList.PrintList();
try
{
ScoreList.Insert(2 ,63);
}
catch(char *s)
{
cout<<s<<endl;
}
cout<<'\n'<<"执行插入操作后的数据为:"<<endl;
ScoreList.PrintList();
cout<<'\n'<<"值为3 的元素位置为:"<<endl;
cout<<'\n'<<ScoreList.Locate(63)<<endl;
cout<<'\n'<<"执行删除第1个元素操作,删除前数据为:"<<endl;
ScoreList.PrintList();
try
{
ScoreList.Delete(1);
}
catch(char *s)
{
cout<<'\n'<<s<<endl;
}
cout<<'\n'<<"删除后的数据为:"<<endl;
ScoreList.PrintList();
}
|
八、实验总结与心得
通过这次的实验,我逐渐了解并熟悉了线性表的顺序存储结构的基本操作。同时,在数据结构实验中用到了C++的模板,让我明白了“温故而知新“。实验中遇到的困难,通过查找书本和询问同学从而解决了,在调试代码的过程中也变得越来越有耐心了。