数据结构顺序表实验

来源:互联网 发布:华为网盘网络异常 编辑:程序博客网 时间:2024/06/05 06:57

一、实验目的

1、熟练掌握线性表的结构特点,掌握顺序表的基本操作。

2、巩固 C++相关的程序设计方法与技术。

3、学会使用顺序表解决实际问题。

二、实验内容
1、顺序表的建立与操作实现
建立n个元素的顺序表(n的大小和表里数据自己确定),实现相关的操作:输出,插
入,删除,查找等功能。编写完整程序实现,程序语言不限定,使用技术形式不定。
2、实际问题的解决(*)
使用顺序表来实现约瑟夫环问题。
三、实验步骤
1、依据实验内容分别说明实验程序中用到的数据类型的定义;
2、相关操作的算法表达;
3、完整程序;
4、总结、运行结果和分析。
5、总体收获和不足,疑问等。

四、代码实现

1、设计模板类   "list.h"

const int Size = 100;template <class Type>        //定义模板类SeqList  class SeqList{public:SeqList() { length = 0; }            //无参构造函数,建立空顺序表  SeqList(Type a[], int n);       //有参构造函数,建立长度为n的顺序表  ~SeqList() { }                   //析构函数  int Length() { return length; }        //求线性表的长度  Type Get(int i);               //按位查找,在表中查找第i个元素  int Locate(Type x);           //按值查找,在表中查找值为x的元素序号  void Insert(int i, Type x);       //插入操作,在表中第i个位置插入值为x的元素  Type Delete(int i);              //删除操作,删除表的第i个元素  void PrintList();                     //遍历操作,按序号依次输出各元素  private:Type data[Size];           //存放数据元素的数组  int length;                        //线性表的长度  };
2、函数实现代码  "list.cpp"

#include "list.h"  template <class Type>SeqList<Type> ::SeqList(Type a[], int n){if (n > Size) throw "错误";for (int i = 0; i < n; i++){data[i] = a[i];}length = n;}template <class Type>Type SeqList<Type>::Get(int i){if (i < 1 && i > length) throw "查找位置非法";else return data[i - 1];}template <class Type>int SeqList<Type> ::Locate(Type x){for (int i = 0; i < length; i++){if (data[i] == x) return i + 1;}return 0;                           }template <class Type>void SeqList<Type> ::Insert(int i, Type x){if (length >= Size) 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++;}template <class Type>Type SeqList<Type> ::Delete(int i){if (length == 0) throw "下溢";if (i < 1 || i > length) throw "位置";Type x = data[i - 1];              //取出位置i的数据 for (int j = i; j < length; j++)data[j - 1] = data[j];        //注意此处j已经是元素所在的数组下标  length--;return x;}template <class Type>void SeqList<Type> ::PrintList(){for (int i = 0; i < length; i++){cout << data[i]<<' ';                   //遍历输出数据  }cout << endl << endl;}

3、主函数  "listmain.cpp"

#include <iostream>            using namespace std;#include "list.cpp"          void main(){int student[7] = { 11,22,33,44,55,66,77 };SeqList<int> ScoreList(student, 7);cout << ">>>插入前数据为:" << endl;ScoreList.PrintList();              try{ScoreList.Insert(1, 88);}catch (char *s){cout << s << endl;}cout << ">>>插入后数据为:" << endl;ScoreList.PrintList();              cout << ">>>值为33的元素位置为:";cout << ScoreList.Locate(33) << endl<<endl; cout << ">>>第二个元素的值为:" ;cout << ScoreList.Get(2) << endl<<endl;cout << ">>>删除第2个元素,删除前数据为:" << endl;ScoreList.PrintList();             try{ScoreList.Delete(2);                }catch (char *s){cout << s << endl;}cout << ">>>删除后数据为:" << endl;ScoreList.PrintList();              }

五、实验结果


六、问题分析

1、对于C++面向对象的熟练程度不够;

2、算法分析不足,元素所在数组下标分析容易出现错误;

七、实验总结

在编写过程中,由于许久没有用到C++进行编程,在代码实现过程中总不太熟练,所以应先温习C++面向对象,能使代码编写流畅,在分析问题中总有不足,应加强对算法的分析。

原创粉丝点击