一位来自停电52个半小时的海妙小可爱的实验一报告

信管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年,使我更加重视。相比于上学期的为了考试和完成课程设计的目的而言,现在更希望是能重新好好学习,日常多使用,真正把这门语言化为自己能熟练掌握的技能!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值