实验2.5 运用间接寻址实现对数据的基本操作

来源:互联网 发布:yellow submarine 知乎 编辑:程序博客网 时间:2024/06/16 02:27

一、实验目的

巩固线性表的数据结构的存储方法和相关操作,

学会针对具体应用,

使用线性表的相关知识来解决具体问题。

二、实验内容

建立一个由n个学生成绩的顺序表,
n的大小由自己确定,
每一个学生的成绩信息由自己确定,
实现数据的对表进行插入、删除、查找等操作。分别输出结果。
三 、实验步骤

1、依据实验内容分别说明实验程序中用到的数据类型的定义;

2、相关操作的算法表达;

3、完整程序;

4、总结、运行结果和分析。

5、总体收获和不足,疑问等。

四、实验算法(参考书本第45页)

1、采用C++的模板机制

const int MaxSize=100;template<class DataType>struct Node{DataType data;};  template<class DataType> class indirectaddressLink { public: indirectaddressLink(DataType a[],int n);~indirectaddressLink(){}; void Insert(int i,int x); int Locate(DataType x); DataType Delete(int i); void PrintList(); private: Node<DataType>*address[MaxSize];int length; };

2、新建indirectaddressLink类声明

template<class DataType> indirectaddressLink<DataType>::indirectaddressLink(DataType a[],int n) { for(int i=0;i<n;i++) { address[i]=new Node<DataType>; address[i]->data=a[i]; } length=n; }

3、插入

template<class DataType>void indirectaddressLink<DataType>::Insert(int i,int x){if(i<=length&&i>0){for(int j=length;j>=i;j--){address[j]=address[j-1];}address[i-1]->data=x;length++;}else{throw"位置";} } 

4、删除

template<class DataType>DataType indirectaddressLink<DataType>::Delete(int i){if(i<=length&&i>=0){int x=address[i-1]->data;for(int j=i;j<length;j++){address[j-1]=address[j];}length--;return x;}else{throw"位置";}}

5、定义

 template<class DataType>  int indirectaddressLink<DataType>::Locate(DataType x)  {  int i=0;  for(i;i<length;i++)  {  if(address[i]->data==x)  {return i+1;}  }  return 0;  }  template<class DataType> void indirectaddressLink<DataType>::PrintList() { for(int i=0;i<length;i++) { cout<<address[i]->data<<endl; } }

6、主函数

int main() { int r[5]={87,68,74,90,80}; indirectaddressLink<int>L(r,5); cout<<"执行插入成绩操作前数据为:"<<endl; L.PrintList(); try { L.Insert(2,70); } catch(char*s) { cout<<s<<endl; } cout<<"执行插入成绩操作后数据为:"<<endl; L.PrintList(); cout<<"值为74的元素位置为:"; cout<<L.Locate(74)<<endl; cout<<"执行删除第一个学生成绩操作前数据为:"<<endl; L.PrintList(); try { L.Delete(1);  }   catch(char*s)  {  cout<<s<<endl;  }  cout<<"执行删除成绩操作后数据为:"<<endl;  L.PrintList();   return 0; }

五、实验代码

#include<iostream> #include<string> using namespace std;const int MaxSize=100;template<class DataType>struct Node{DataType data;};  template<class DataType> class indirectaddressLink { public: indirectaddressLink(DataType a[],int n);~indirectaddressLink(){}; void Insert(int i,int x); int Locate(DataType x); DataType Delete(int i); void PrintList(); private: Node<DataType>*address[MaxSize];int length; };  template<class DataType> indirectaddressLink<DataType>::indirectaddressLink(DataType a[],int n) { for(int i=0;i<n;i++) { address[i]=new Node<DataType>; address[i]->data=a[i]; } length=n; }template<class DataType>void indirectaddressLink<DataType>::Insert(int i,int x){if(i<=length&&i>0){for(int j=length;j>=i;j--){address[j]=address[j-1];}address[i-1]->data=x;length++;}else{throw"位置";} }    template<class DataType>DataType indirectaddressLink<DataType>::Delete(int i){if(i<=length&&i>=0){int x=address[i-1]->data;for(int j=i;j<length;j++){address[j-1]=address[j];}length--;return x;}else{throw"位置";}}    template<class DataType>  int indirectaddressLink<DataType>::Locate(DataType x)  {  int i=0;  for(i;i<length;i++)  {  if(address[i]->data==x)  {return i+1;}  }  return 0;  }  template<class DataType> void indirectaddressLink<DataType>::PrintList() { for(int i=0;i<length;i++) { cout<<address[i]->data<<endl; } }  int main() { int r[5]={87,68,74,90,80}; indirectaddressLink<int>L(r,5); cout<<"执行插入成绩操作前数据为:"<<endl; L.PrintList(); try { L.Insert(2,70); } catch(char*s) { cout<<s<<endl; } cout<<"执行插入成绩操作后数据为:"<<endl; L.PrintList(); cout<<"值为74的元素位置为:"; cout<<L.Locate(74)<<endl; cout<<"执行删除第一个学生成绩操作前数据为:"<<endl; L.PrintList(); try { L.Delete(1);  }   catch(char*s)  {  cout<<s<<endl;  }  cout<<"执行删除成绩操作后数据为:"<<endl;  L.PrintList();   return 0; }

六、实验运行结果


七、实验总结和心得

间接寻址是将数组和指针结合起来的一种方法,
它将数组中存储数据元素的单元改为存储指向该元素的指针。
实验中删除操作和插入操作其实是类似的。虽然调试了出来,
可是发现实验结果中原本的数字“68”变成了需要插入的数字“70”。
对于这个错误,暂时找不到原因。

原创粉丝点击