信管1162肖琼的数据结构实验一报告
实验一线性表的基本操作实现及其应用
一、实验目的
1、熟练掌握线性表的结构特点,掌握顺序表的基本操作。
2、巩固C++相关的程序设计方法与方法
3、学会使用顺序表解决实际问题
二、实验内容
1、顺序表的建立与操作实现
建立N个元素的顺序表(n的大小和表里数据自己确定),实现相关的操作:输出、插入、删除、查找等功能。
2、实际问题的解决
使用顺序表来实现约瑟夫环问题
三、实验步骤源代码
#include <iostream>
using namespace std;
const int MaxSize = 100;
template<class DataType>
class SeqList
{
public:
SeqList() { length = 0; }
SeqList(DataType a[], int n);
~SeqList() {};
int Length()
{
return length;
}
DataType Get(int i);
int Locate(DataType x);
void Insert(int i, DataType x);
DataType Delete(int i);
void PrintList();
private:
DataType data[MaxSize];
int length;
};
//顺序表有参构造函数SeqList
template<class DataType>
SeqList<DataType>::SeqList(DataType a[], int n)
{
if (n > MaxSize)
throw "参数非法";
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)//下标为1的元素等于x,返回其序号i+1
return 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];
for (int j = i; j < length; j++)
data[j - 1] = data[j];
length--;
return x;
}
//顺序表遍历算法 PrintList
template<class DataType>
void SeqList<DataType>::PrintList()
{
for (int i = 0; i < length; i++)
cout << data[i] << endl; //依次输出线性表的元素值
}
int main()
{
int arr[10] = { 1,22,50,26,70,52,20,2,24,6 };
SeqList<int> demo(arr, 10);
demo.PrintList();
//cout << demo.Delete(2) << endl;
//demo.Insert(5, 66);
cout << "--------------------" << endl;
cout << "" << endl;
cout << "--------------------" << endl;
//cout << demo.Locate(2)<<endl;
//cout << demo.Get(5) << endl;
demo.PrintList();
return 0;
}
//该程序未经过处理,所有操作进行了注释!
四、程序运行结果截图
①未经操作程序 对比
int main()
{
int arr[10] = { 1,22,50,26,70,52,20,2,24,6 };
SeqList<int> demo(arr, 10);
demo.PrintList();
//cout << demo.Delete(2) << endl;
//demo.Insert(5, 66);
cout << "--------------------" << endl;
cout << "" << endl;
cout << "--------------------" << endl;
//cout << demo.Locate(2)<<endl;
//cout << demo.Get(5) << endl;
demo.PrintList();
return 0;
}
②按位查找算法Get
int main()
{
int arr[10] = { 1,22,50,26,70,52,20,2,24,6 };
SeqList<int> demo(arr, 10);
demo.PrintList();
cout << "--------------------" << endl;
cout << "" << endl;
cout << "--------------------" << endl;
cout << demo.Get(5) << endl;
demo.PrintList();
return 0;
}
查找数据中的第五位元素,将第五位元素“70”提取到最前面,其他的元素按照原排列顺序不变进行遍历。
③按值查找算法Locate
int main()
{
int arr[10] = { 1,22,50,26,70,52,20,2,24,6 };
SeqList<int> demo(arr, 10);
demo.PrintList();
cout << "--------------------" << endl;
cout << "" << endl;
cout << "--------------------" << endl;
cout << demo.Locate(2)<<endl;
demo.PrintList();
return 0;
}
查找值为“2”的元素,将位置显示至首位。“2”元素对应的位置是第8个,则显示为“8”。
查找值为“100”的元素,若是没有则位置显示为“0”
④删除算法Delete
int main()
{
int arr[10] = { 1,22,50,26,70,52,20,2,24,6 };
SeqList<int> demo(arr, 10);
demo.PrintList();
cout << demo.Delete(2) << endl;
cout << "--------------------" << endl;
cout << "" << endl;
cout << "--------------------" << endl;
demo.PrintList();
return 0;
}
删除第二位的元素,即“22”,其余数据遍历输出,则无该数据。
五、疑问
1. 为啥书上的代码有一部分是伪代码?每次敲出来都要修改贼久,需要给一些漏掉的未定义类型的变量,增加类型。
2.约瑟夫环问题尚未解决
六、收获总结
通过一个简单的顺序表系统的编写,我重拾了丢下快3个月的C++语言。这次主要是对着书本上代码敲入电脑,进行运行。
对格式方面的问题,在敲的过程中,也有着重注意。通过顺序表的查找、增加、删除、遍历输出的小功能,实现了C++和数据结构的过渡和衔接。让我知道C++这门基础编程语言,将贯彻我们专业4年,使我更加重视。相比于上学期的为了考试和完成课程设计的目的而言,现在更希望是能重新好好学习,日常多使用,真正把这门语言化为自己能熟练掌握的技能!