阅读建议:
一、实验目的
二、实验内容
三、实验过程
四、代码结构
五、测试结果
阅读建议:
1.实验的软硬件环境要求:
(1)硬件环境要求:PC机
(2)软件环境要求:Windows 环境下的 Microsoft Visual Studio2.该实验采用了头文件(.h)和源文件(.cpp)相结合的形式。
1. 熟练掌握顺序表的存储特点;
2. 熟练掌握顺序表的基本算法:例如插入、删除、按值或按序号查找、输出等,并拓展一些操作算法,例如置逆、按值删除等;
3. 熟练掌握面向对象程序设计方法;
4. 能灵活使用顺序表解决具体的问题。
1.定义顺序表类模板,例如SeqList,封装顺序表的基本操作算法;
2.在主函数中定义对象,并调用成员函数,验证顺序表的基本操作。
1.建立顺序表,完成初始化。
template
SeqList ::SeqList(int n) //初始化顺序表长度
{
int i;
if (n > MAX_LENGTH) {
throw std::invalid_argument("参数非法");
}
for (i = 0; i < n; i++) {
cin >> data[i];
}
length = n;
}
2.插入操作,通过传入的参数 i 进行定位,然后插入元素 x。
template
void SeqList ::Insert(int i, T x)
{
int j;
if (length == MAX_LENGTH) {
throw std::invalid_argument("上溢");
} //检查剩余空间
if (i<1 || i>length + 1) {
throw"位置异常";
} //检查i的合理性
for (j = length; j >= i; j--) {
data[j] = data[j - 1]; //元素后移
}
data[i - 1] = x; //添加元素
length++;
}
3.按位删除操作,通过传入的参数 i 进行定位,然后删除下标为 i-1 的元素。
template
T SeqList ::Delete(int i)
{
T j;
int x;
if (length == 0) {
throw std::invalid_argument("下溢");
//throw"下溢";
}
if (i<1 || i>length + 1) {
throw"删除位置错误";
} //检查i的合理性
x = data[i - 1];
for (int j = i; j < length; j++) {
data[j - 1] = data[j];
}
length--;
return x;
}
4.按值删除操作,通过传入的参数 x 进行循环比较,然后删除该元素。
template
void SeqList::DeleteValue(T x)
{
int i;
for (i = 0; i < length; i++) {
if (data[i] == x) {
break;
}
}
if (i < length) {
for (int j = i; j < length - 1; j++) {
data[j] = data[j + 1];
}
length--;
}
}
5.按位查找,通过传入的参数 i 返回下表为 i-1 的元素。
template
T SeqList::Get(int i)
{
if (i<1 || i>length) {
throw std::invalid_argument("查找位置异常");
//throw"查找位置异常";
}
else {
return(data[i - 1]);
}
}
6.按值查找,通过传入的参数 x 循环比较后,返回 i+1 。
template
int SeqList::Locate(T x)
{
for (int i = 0; i < length; i++){
if (data[i] == x){
return(i + 1);
}
}
return 0;
}
7.遍历操作,逐一遍历该顺序表输出所有元素。
template
void SeqList::PrintList()
{
int i;
if (length == 0) {
cout << "空表" << endl;
}else {
for (i = 0; i < length; i++) {
cout << data[i] << " ";
}
}
cout << endl;
}
8.逆置,从顺序表两端开始循环遍历进行交换。
template
void SeqList::Reverse()
{
for (int i = 0, j = length - 1; i < j; i++, j--)
{
int t = data[i];
data[i] = data[j];
data[j] = t;
}
}
9.主函数
int main()
{
int r[5] = { 1, 2, 3, 4, 5 }, i, x;
//建立顺序表
SeqList L(5); //建立具有5个元素的顺序表
//打印线性表
cout << "当前线性表的数据为:";
L.PrintList(); //输出当前线性表1 2 3 4 5
//插入元素
try
{
int a, b;
cout << "插入的位置和插入的数字:";
cin >> a >> b;
L.Insert(a, b); //在第a个位置插入值为b的元素
cout << endl << "执行插入操作后数据为:";
L.PrintList(); //输出插入后的线性表
cout << endl;
}
catch (const char* str) {
cout << str << "插入操作错误!" << endl;
}
//当前线性表的长度
cout << "当前线性表的长度为:" << L.Length(); //输出线性表的长度6
cout << endl;
//按值查找
cout << "请输入查找的元素值:";
cin >> x;
i = L.Locate(x);
if (0 == i) cout << "查找失败" << endl;
else cout << "元素" << x << "的位置为:" << i << endl;
//按位查找
try
{
cout << "请输入查找第几个元素值:";
cin >> i;
cout << "第" << i << "个元素值是" << L.Get(i) << endl;
}
catch (const char* str) {
cout << str << endl;
}
//按位删除操作
try
{
cout << "请输入要删除的位置:";
cin >> i;
//x=L.Locate(i);
x = L.Delete(i);
cout << "删除的元素值为:" << x << endl;
cout << "删除后线性表的数据为:";
L.PrintList();
}
catch (const char* str) {
cout << str << "删除操作错误!" << endl;
}
// 按值删除操作
try
{
cout << "请输入要删除的元素值:";
cin >> i;
if (i != 0) {
L.DeleteValue(i);
cout << "删除成功!" << endl;
cout << "删除后线性表的数据为:";
L.PrintList();
}
else {
cout << "未找到要删除的元素!" << endl;
}
}
catch (const char* str)
{
cout << str << "删除操作错误!" << endl;
}
//逆置
cout << "执行逆置操作后,线性表的数据为:";
L.Reverse();
L.PrintList(); //输出逆置后的线性表
return 0;
}
完整代码链接:https://download.csdn.net/download/weixin_73286497/88758616
希望大家可以在该篇实验报告中有所收获,同时也感谢各位大佬的支持。文章如有任何问题请在评论区留言斧正,鸿蒙会尽快回复您的建议!