当前位置:   article > 正文

【数据结构与算法】【C++】顺序表实验报告(一)

【数据结构与算法】【C++】顺序表实验报告(一)

目录

阅读建议:

一、实验目的

二、实验内容

三、实验过程

四、代码结构

五、测试结果


阅读建议:

1.实验的软硬件环境要求:

(1)硬件环境要求:PC机
(2)软件环境要求:Windows 环境下的 Microsoft Visual Studio

2.该实验采用了头文件(.h)和源文件(.cpp)相结合的形式。


一、实验目的

1. 熟练掌握顺序表的存储特点;

2. 熟练掌握顺序表的基本算法:例如插入、删除、按值或按序号查找、输出等,并拓展一些操作算法,例如置逆、按值删除等;

3. 熟练掌握面向对象程序设计方法;

4. 能灵活使用顺序表解决具体的问题。


二、实验内容

 1.定义顺序表类模板,例如SeqList,封装顺序表的基本操作算法;

 2.在主函数中定义对象,并调用成员函数,验证顺序表的基本操作


三、实验过程

1.建立顺序表,完成初始化。

  1. template<class T>
  2. SeqList <T>::SeqList(int n) //初始化顺序表长度
  3. {
  4. int i;
  5. if (n > MAX_LENGTH) {
  6. throw std::invalid_argument("参数非法");
  7. }
  8. for (i = 0; i < n; i++) {
  9. cin >> data[i];
  10. }
  11. length = n;
  12. }

2.插入操作,通过传入的参数 i 进行定位,然后插入元素 x。

  1. template<class T>
  2. void SeqList <T>::Insert(int i, T x)
  3. {
  4. int j;
  5. if (length == MAX_LENGTH) {
  6. throw std::invalid_argument("上溢");
  7. } //检查剩余空间
  8. if (i<1 || i>length + 1) {
  9. throw"位置异常";
  10. } //检查i的合理性
  11. for (j = length; j >= i; j--) {
  12. data[j] = data[j - 1]; //元素后移
  13. }
  14. data[i - 1] = x; //添加元素
  15. length++;
  16. }

3.按位删除操作,通过传入的参数 i 进行定位,然后删除下标为 i-1 的元素。

  1. template<typename T>
  2. T SeqList <T>::Delete(int i)
  3. {
  4. T j;
  5. int x;
  6. if (length == 0) {
  7. throw std::invalid_argument("下溢");
  8. //throw"下溢";
  9. }
  10. if (i<1 || i>length + 1) {
  11. throw"删除位置错误";
  12. } //检查i的合理性
  13. x = data[i - 1];
  14. for (int j = i; j < length; j++) {
  15. data[j - 1] = data[j];
  16. }
  17. length--;
  18. return x;
  19. }

4.按值删除操作,通过传入的参数 x 进行循环比较,然后删除该元素。

  1. template<typename T>
  2. void SeqList<T>::DeleteValue(T x)
  3. {
  4. int i;
  5. for (i = 0; i < length; i++) {
  6. if (data[i] == x) {
  7. break;
  8. }
  9. }
  10. if (i < length) {
  11. for (int j = i; j < length - 1; j++) {
  12. data[j] = data[j + 1];
  13. }
  14. length--;
  15. }
  16. }

5.按位查找,通过传入的参数 i 返回下表为 i-1 的元素。

  1. template<class T>
  2. T SeqList<T>::Get(int i)
  3. {
  4. if (i<1 || i>length) {
  5. throw std::invalid_argument("查找位置异常");
  6. //throw"查找位置异常";
  7. }
  8. else {
  9. return(data[i - 1]);
  10. }
  11. }

6.按值查找,通过传入的参数 x 循环比较后,返回 i+1 。

  1. template<class T>
  2. int SeqList<T>::Locate(T x)
  3. {
  4. for (int i = 0; i < length; i++){
  5. if (data[i] == x){
  6. return(i + 1);
  7. }
  8. }
  9. return 0;
  10. }

7.遍历操作,逐一遍历该顺序表输出所有元素。

  1. template<class T>
  2. void SeqList<T>::PrintList()
  3. {
  4. int i;
  5. if (length == 0) {
  6. cout << "空表" << endl;
  7. }else {
  8. for (i = 0; i < length; i++) {
  9. cout << data[i] << " ";
  10. }
  11. }
  12. cout << endl;
  13. }

8.逆置,从顺序表两端开始循环遍历进行交换。

  1. template<class T>
  2. void SeqList<T>::Reverse()
  3. {
  4. for (int i = 0, j = length - 1; i < j; i++, j--)
  5. {
  6. int t = data[i];
  7. data[i] = data[j];
  8. data[j] = t;
  9. }
  10. }

9.主函数

  1. int main()
  2. {
  3. int r[5] = { 1, 2, 3, 4, 5 }, i, x;
  4. //建立顺序表
  5. SeqList<int> L(5); //建立具有5个元素的顺序表
  6. //打印线性表
  7. cout << "当前线性表的数据为:";
  8. L.PrintList(); //输出当前线性表1 2 3 4 5
  9. //插入元素
  10. try
  11. {
  12. int a, b;
  13. cout << "插入的位置和插入的数字:";
  14. cin >> a >> b;
  15. L.Insert(a, b); //在第a个位置插入值为b的元素
  16. cout << endl << "执行插入操作后数据为:";
  17. L.PrintList(); //输出插入后的线性表
  18. cout << endl;
  19. }
  20. catch (const char* str) {
  21. cout << str << "插入操作错误!" << endl;
  22. }
  23. //当前线性表的长度
  24. cout << "当前线性表的长度为:" << L.Length(); //输出线性表的长度6
  25. cout << endl;
  26. //按值查找
  27. cout << "请输入查找的元素值:";
  28. cin >> x;
  29. i = L.Locate(x);
  30. if (0 == i) cout << "查找失败" << endl;
  31. else cout << "元素" << x << "的位置为:" << i << endl;
  32. //按位查找
  33. try
  34. {
  35. cout << "请输入查找第几个元素值:";
  36. cin >> i;
  37. cout << "第" << i << "个元素值是" << L.Get(i) << endl;
  38. }
  39. catch (const char* str) {
  40. cout << str << endl;
  41. }
  42. //按位删除操作
  43. try
  44. {
  45. cout << "请输入要删除的位置:";
  46. cin >> i;
  47. //x=L.Locate(i);
  48. x = L.Delete(i);
  49. cout << "删除的元素值为:" << x << endl;
  50. cout << "删除后线性表的数据为:";
  51. L.PrintList();
  52. }
  53. catch (const char* str) {
  54. cout << str << "删除操作错误!" << endl;
  55. }
  56. // 按值删除操作
  57. try
  58. {
  59. cout << "请输入要删除的元素值:";
  60. cin >> i;
  61. if (i != 0) {
  62. L.DeleteValue(i);
  63. cout << "删除成功!" << endl;
  64. cout << "删除后线性表的数据为:";
  65. L.PrintList();
  66. }
  67. else {
  68. cout << "未找到要删除的元素!" << endl;
  69. }
  70. }
  71. catch (const char* str)
  72. {
  73. cout << str << "删除操作错误!" << endl;
  74. }
  75. //逆置
  76. cout << "执行逆置操作后,线性表的数据为:";
  77. L.Reverse();
  78. L.PrintList(); //输出逆置后的线性表
  79. return 0;
  80. }

四、代码结构


五、测试结果


        完整代码链接:https://download.csdn.net/download/weixin_73286497/88758616

        希望大家可以在该篇实验报告中有所收获,同时也感谢各位大佬的支持。文章如有任何问题请在评论区留言斧正,鸿蒙会尽快回复您的建议!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/556644
推荐阅读
相关标签
  

闽ICP备14008679号