赞
踩
阅读建议:
1.实验的软硬件环境要求:
(1)硬件环境要求:PC机
(2)软件环境要求:Windows 环境下的 Microsoft Visual Studio2.该实验采用了头文件(.h)和源文件(.cpp)相结合的形式。
1. 熟练掌握顺序表的存储特点;
2. 熟练掌握顺序表的基本算法:例如插入、删除、按值或按序号查找、输出等,并拓展一些操作算法,例如置逆、按值删除等;
3. 熟练掌握面向对象程序设计方法;
4. 能灵活使用顺序表解决具体的问题。
1.定义顺序表类模板,例如SeqList,封装顺序表的基本操作算法;
2.在主函数中定义对象,并调用成员函数,验证顺序表的基本操作。
1.建立顺序表,完成初始化。
- template<class T>
- SeqList <T>::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<class T>
- void SeqList <T>::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<typename T>
- T SeqList <T>::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<typename T>
- void SeqList<T>::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<class T>
- T SeqList<T>::Get(int i)
- {
- if (i<1 || i>length) {
- throw std::invalid_argument("查找位置异常");
- //throw"查找位置异常";
- }
- else {
- return(data[i - 1]);
- }
- }
6.按值查找,通过传入的参数 x 循环比较后,返回 i+1 。
- template<class T>
- int SeqList<T>::Locate(T x)
- {
- for (int i = 0; i < length; i++){
- if (data[i] == x){
- return(i + 1);
- }
- }
- return 0;
- }
7.遍历操作,逐一遍历该顺序表输出所有元素。
- template<class T>
- void SeqList<T>::PrintList()
- {
- int i;
- if (length == 0) {
- cout << "空表" << endl;
- }else {
- for (i = 0; i < length; i++) {
- cout << data[i] << " ";
- }
- }
- cout << endl;
- }
8.逆置,从顺序表两端开始循环遍历进行交换。
- template<class T>
- void SeqList<T>::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<int> 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
希望大家可以在该篇实验报告中有所收获,同时也感谢各位大佬的支持。文章如有任何问题请在评论区留言斧正,鸿蒙会尽快回复您的建议!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。